之前學習Servlet中的Filter組件的時候,感覺很模糊,最近在做一個項目的時候發現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;
private HttpServletRequest request;
private HttpServletResponse response;
//重寫Filter接口的destory方法
public void destroy() {}
public void destroy() {}
//重寫doFilter方法,這個方法在這裏主要作用是將ServletRequest,ServletResponse對象轉爲對 //應的HttpServletRequest,HttpServletResponse對象
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
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;
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(){}
}
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");
}
}
@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-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纔是最終目的,好了,我大概說一下我在開發中用到的地方。
①.上面提到的禁用瀏覽器的緩存。這個真的很重要,有時候修改了前端頁面,就是因爲緩存的原因,導致頁面不 能及時刷新過來,真的很蛋疼。
②.解決中文亂碼的問題。在開發中,頁面可能達到幾十個甚至上百個,在每個頁面處理中文亂碼的問題很煩,但 是通過過濾器,那麼問題就變得很簡單了。
③.通過檢查用戶是否登錄來管理用戶是否可以訪問某些頁面,比如個人隱私等頁面。這個用的也是蠻多的。