Ⅰ servlet中filter有什麼用
首先介紹一下Filter到底是個什麼東西:
根據這個單詞就能猜到Filter的中文意思是過濾器,事實當然也是這樣的;Filter是Servlet中的一個重 要組件。
接下來簡單說說Filter這個介面中的常用方法吧。
①.init():類似於Servlet生命周期中的init()方法,用於初始化一些關於Filter介面的參數;只在Servlet 啟動時調用一次。
②.doFilter():類似於Servlete生命周期中的service()方法,該方法用於存放邏輯代碼。
③.destory():同理類似於Servlet生命周期中的destroy()方法,當Servlet容器銷毀前調用該方法。
然後說說如何創建一個Filter的HelloWorld。
①.創一個抽象的Java類,該類實現了Filter介面,同時實現了Filter介面的部分方法,例如
init(),destroy()方法。具體實現代碼如下:
public abstract class HttpFilter implements Filter {
private HttpServletRequest request;
private HttpServletResponse response;
//重寫Filter介面的destory方法
public void destroy() {}
//重寫doFilter方法,這個方法在這里主要作用是將ServletRequest,ServletResponse對象轉為對 //應的HttpServletRequest,HttpServletResponse對象
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
this.request = (HttpServletRequest) arg0;
this.response = (HttpServletResponse) arg1;
doFilter(request, response, arg2);
}
//該方法交由繼承該抽象類的實現類來實現
public abstract void doFilter(HttpServletRequest request,HttpServletResponse response,
FilterChain chain);
private FilterConfig config;
//這個方法是為了方便子類獲取ServletContext對象
public FilterConfig getFilterConfig(){
return config;
}
//該方法一般不建議重寫,因為重寫該方法會出現某些錯,基於此提供了下面的無參數的init()方法
public void init(FilterConfig arg0) throws ServletException {
this.config = arg0;
init();
}
public void init(){}
}
②.一個繼承了HttpFilter抽象類的實現類,代碼如下,只要功能是為了實現禁用瀏覽器緩存
public class NoCacheFilter extends HttpFilter{
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
//通過過濾器實現頁面禁用瀏覽器緩存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
}
}
③.將該實現類配置到web.xml文件中,配置方式和配置普通的Servlet一樣,具體代碼
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.xingyun.servlet.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
至此,就實現了一個簡單的用於禁用瀏覽器緩存的過濾器了。
上面說了這么多,在開發中哪些地方中能用到Filter才是最終目的,好了,我大概說一下我在開發中用到的地方。
①.上面提到的禁用瀏覽器的緩存。這個真的很重要,有時候修改了前端頁面,就是因為緩存的原因,導致頁面不 能及時刷新過來,真的很蛋疼。
②.解決中文亂碼的問題。在開發中,頁面可能達到幾十個甚至上百個,在每個頁面處理中文亂碼的問題很煩,但 是通過過濾器,那麼問題就變得很簡單了。
③.通過檢查用戶是否登錄來管理用戶是否可以訪問某些頁面,比如個人隱私等頁面。這個用的也是蠻多的。
Ⅱ Elasticsearch的緩存機制簡介
根據名稱其實就能理解,這是屬於Node級別的緩存。主要用於緩存Filter中的Query結果,基於LRU策略,當緩存滿了的情況下,會自動去除一個最近最少被使用的Query Cache。
緩存分為兩個級別,第一級是 Query ,第二級是 Segmemt ,就像是 Map<Query, Map<Segment, DocIdSet>> 這種結構一樣。 DocIdSet 使用的數據結構是 Bitset 。
indices.queries.cache.size 集群中的每個節點都必須有的靜態配置,用來控制用來緩存的內存大小,默認是10%,支持兩種格式一種是百分數,代表占節點heap的百分比,另一種則是精確的值,比如512mb。
indices.queries.cache.count 在官方文檔並沒有寫,這是一個節點級別的配置,可以在elasticsearch.yml中配置,控制緩存的總數量。
indices.queries.cache.all_segments 用於是否在所有 Segment 上啟用緩存,默認是false,不會對文檔數小於100000或者小於整個索引大小的3%的 Segment 進行緩存。
index.queries.cache.enabled 是屬於index級別的配置,用來控制是否啟用緩存,默認是開啟的。
Segment 中文檔數大於100000或者大於整個所以大小的3%。
請注意如果想要索引所有段,請設置indices.queries.cache.all_segments
緩存不會失效,而是通過判斷文檔是否符合 Query 的條件,如果符合條件的話則會將文檔加入到 Bitset 中。
主要用於 sort 以及 aggs 的欄位。這會把欄位的值載入到內存中,以便於快速訪問。 field data cache 的構建非常昂貴,因此最好能分配足夠的內存以保障它能長時間處於被載入的狀態。
indices.fielddata.cache.size 用來控制緩存的大小,支持兩種格式,一種是百分數,代表占節點heap的百分比,另一種是精確值,如10gb,默認是無限。
顧名思義,Shard級別的緩存。默認的主要用於緩存size=0的請求, aggs 和 suggestions ,還有就是 hits.total 。
需要注意,每當分片索引refresh的時候,如果數據發生了實際變化,那麼緩存就會自動失效。所以呢,refresh時間越長,那麼緩存的時間也就越長。緩存採用的也是LRU策略。
index.requests.cache.enable 這個參數用來控制是否啟用分片級別的緩存,默認是false
通過url傳參方式request_cache=true
indices.requests.cache.size 用來控制緩存在 heap 中的大小,默認是1%。
用於緩存新索引的數據,用於緩存新索引的數據,當空間填滿之後,會將數據寫到磁碟上成為一個新的段。