Servlet中的Filter詳解

   之前學習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;
      
          //重寫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纔是最終目的,好了,我大概說一下我在開發中用到的地方。
  
  ①.上面提到的禁用瀏覽器的緩存。這個真的很重要,有時候修改了前端頁面,就是因爲緩存的原因,導致頁面不     能及時刷新過來,真的很蛋疼。
 
  ②.解決中文亂碼的問題。在開發中,頁面可能達到幾十個甚至上百個,在每個頁面處理中文亂碼的問題很煩,但     是通過過濾器,那麼問題就變得很簡單了。

  ③.通過檢查用戶是否登錄來管理用戶是否可以訪問某些頁面,比如個人隱私等頁面。這個用的也是蠻多的。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章