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进行处理。

 

Java代码   收藏代码
  1. public class ExampleFilter implements Filter {  
  2.    
  3.    @Override  
  4.    public void destroy() {  
  5.       System.out.println("destory filter……");  
  6.    }  
  7.    
  8.    @Override  
  9.    public void doFilter(ServletRequest request, ServletResponse response,  
  10.          FilterChain chain) throws IOException, ServletException {  
  11.       System.out.println("filter……");  
  12.       chain.doFilter(request, response);  
  13.    }  
  14.    
  15.    @Override  
  16.    public void init(FilterConfig filterConfig) throws ServletException {  
  17.       String param1 = filterConfig.getInitParameter("param1");  
  18.       System.out.println("filter init……" + param1);  
  19.    }  
  20.    
  21. }  

  

       至于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有重复的,则当前过滤器会执行两次

 

       使用注解进行配置:

Java代码   收藏代码
  1. @WebFilter(urlPatterns={"/servlet/*"}, asyncSupported=true, dispatcherTypes={DispatcherType.REQUEST},  
  2.          initParams=@WebInitParam(name="param1", value="value1"))  
  3. public class ExampleFilter implements Filter {  
  4.    
  5.    @Override  
  6.    public void destroy() {  
  7.       System.out.println("destory filter……");  
  8.    }  
  9.    
  10.    @Override  
  11.    public void doFilter(ServletRequest request, ServletResponse response,  
  12.          FilterChain chain) throws IOException, ServletException {  
  13.       System.out.println("filter……");  
  14.       chain.doFilter(request, response);  
  15.    }  
  16.    
  17.    @Override  
  18.    public void init(FilterConfig filterConfig) throws ServletException {  
  19.       String param1 = filterConfig.getInitParameter("param1");  
  20.       System.out.println("filter init……" + param1);  
  21.    }  
  22.    
  23. }  

 

       web.xml中进行配置:

Xml代码   收藏代码
  1. <filter>  
  2.    <filter-name>example</filter-name>  
  3.    <async-supported>true</async-supported>  
  4.    <filter-class>com.xxx.ExampleFilter</filter-class>  
  5.    <init-param>  
  6.       <param-name>param1</param-name>  
  7.       <param-value>value1</param-value>  
  8.    </init-param>  
  9. </filter>  
  10. <filter-mapping>  
  11.    <filter-name>example</filter-name>  
  12.    <dispatcher>REQUEST</dispatcher>  
  13.    <dispatcher>FORWARD</dispatcher>  
  14.    <servlet-name>exampleServlet</servlet-name>  
  15.    <url-pattern>/servlet/*</url-pattern>  
  16. </filter-mapping>  

 

 

猜你喜欢

转载自zzc1684.iteye.com/blog/2191971