Servlet3.0過濾器

Servlet3.0過濾器

 

       Servlet3.0裏面的過濾器跟以前版本的一樣,還是需要實現javax.servlet.Filter接口。Filter接口中定義了三個方法,init(FilterConfig filterConfig)destroy()doFilter(HttpRequest request, HttpServletResponse response, FilterChain chain)

       init()方法會在Filter初始化後進行調用,在init()方法裏面我們可以通過FilterConfig訪問到初始化參數(getInitParameter()getInitParameters())、ServletContextgetServletContext)和當前Filter部署的名稱(getFilterName())等信息。destroy()方法將在Filter被銷燬之前調用。而doFilter()方法則是真正進行過濾處理的方法,在doFilter()方法內部,我們可以過濾請求的request和返回的response,同時我們還可以利用FilterChain把當前的requestresponse傳遞給下一個過濾器或Servlet進行處理。

 

public class ExampleFilter implements Filter {
 
   @Override
   public void destroy() {
      System.out.println("destory filter……");
   }
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
         FilterChain chain) throws IOException, ServletException {
      System.out.println("filter……");
      chain.doFilter(request, response);
   }
 
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
      String param1 = filterConfig.getInitParameter("param1");
      System.out.println("filter init……" + param1);
   }
 
}

  

       至於Filter的配置,在Servlet3.0中我們除了使用傳統的方式在web.xml文件中進行配置以外,還可以使用註解的方式進行配置。使用註解的方式配置時我們需要在Filter實現類上用@WebFilter註解進行標註,然後指定其urlPatterns屬性或者value屬性。@WebFilter註解的可配置屬性和@WebServlet的可配置屬性基本上是差不多的。在@WebFilterurlPatterns屬性和value屬性都可以用來指定當前Filter要過濾的請求地址,且它們都是數組形式,支持同時指定多個地址進行過濾,但是不能同時指定urlPatterns屬性和value屬性,如果同時指定了urlPatterns屬性和value屬性則請求地址過濾會失效,這個時候就只能通過servletNames來進行過濾了。除了urlPatterns屬性和value屬性外,@WebFilter還可以指定以下幾個比較重要的屬性:

l  initParams:用於指定初始化參數的,其內容是一個@WebInitParam數組,其中每一個@WebInitParam代表一個初始化參數。

l  asyncSupported:表示是否支持異步調用,默認是false,關於Servlet3.0中的異步調用請參考我的另一篇文章(Servlet3.0Servlet的使用)。有一點需要注意的地方是如果FilterasyncSupported指定爲false,那麼經過Filter過濾後的request將不再支持異步調用了。

l  dispatcherTypes:指定Filter需要過濾的dispatcher類型,它是一個數組類型,裏面的每一個元素都是枚舉DispatcherType的一個元素。支持的元素有ASYNCERRORREQUESTFORWARDINCLUDE,默認是REQUEST

l  servletNames:字符串數組類型,指定需要過濾的servlet名稱。servletNames過濾跟url過濾是不一樣的,如果指定的servletNamesurlPatternsvalue有重複的,則當前過濾器會執行兩次

 

       使用註解進行配置:

@WebFilter(urlPatterns={"/servlet/*"}, asyncSupported=true, dispatcherTypes={DispatcherType.REQUEST},
         initParams=@WebInitParam(name="param1", value="value1"))
public class ExampleFilter implements Filter {
 
   @Override
   public void destroy() {
      System.out.println("destory filter……");
   }
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
         FilterChain chain) throws IOException, ServletException {
      System.out.println("filter……");
      chain.doFilter(request, response);
   }
 
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
      String param1 = filterConfig.getInitParameter("param1");
      System.out.println("filter init……" + param1);
   }
 
}

 

       web.xml中進行配置:

   <filter>
      <filter-name>example</filter-name>
      <async-supported>true</async-supported>
      <filter-class>com.xxx.ExampleFilter</filter-class>
      <init-param>
         <param-name>param1</param-name>
         <param-value>value1</param-value>
      </init-param>
   </filter>
   <filter-mapping>
      <filter-name>example</filter-name>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
      <servlet-name>exampleServlet</servlet-name>
      <url-pattern>/servlet/*</url-pattern>
   </filter-mapping>

 

 

 

 

 

 

 

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