Servlet的Filter过滤器

来源:互联网 发布:笔记本内存条检测软件 编辑:程序博客网 时间:2024/04/28 12:54
来源:http://gotothework.javaeye.com/blog/226204
过滤器是请求和响应之间的一种WEB组件,它驻留在服务器端,用来截取客户端与资源之间的请求,并对这些信息进行“过滤”。

Servlet容器对部署描述符中声明的每一个过滤器只会创建一个实例。与Servlet类似,容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务,因此开发过滤器时要注意线程安全问题。

当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联,如果有那么容器将把请求交给过滤器进行处理,在过滤器中可以改变请求的内容,或重新设置请求的报头信息,然后将请求发送给目标资源,当目标资源对请求做出响应时,容器同样会将响应转发给过滤器,在过滤器中可以对响应的内容进行过滤,从上面的过程我们可以看出,客户端和目标资源不需要知道过滤器的存在,对于客户端来说是透明的。

过滤器位于javax.servlet包中,有3个主要方法:
1.init(FilterConfig config)
  Web容器调用方法来初始化过滤器,容器在调用该方法时,向过滤器传递FilterConfig对象,FilterConfig用法和ServletConfig类似。利用FilterConfig对象可以得到ServletContext对象,以及在部署描述符中配置的过滤器的初始化参数。

2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
  doFilter()方法类似Servlet接口的service()方法。当客户端请求目标资源的时候,容器会调用与这个目标资源想关联的过滤器的doFilter()方法。在这个方法中,可以对请求和响应进行处理,实现过滤器的功能。在特定的操作完成后,可以调用chain.doFilter()方法将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或利用RequestDispatcher的forward()和include()方法,以及sendRedirect()方法转发。
但是要注意,这个方法的请求响应参数的类型是ServletRequest和ServletResponse,也就是说过滤器的使用不依赖具体的协议。

3.destroy()
  Web容器调用该方法只是过滤器的声明周期结束。

下面看下过滤器在Web.xml中的声明:

Java代码
  1. <filter>   
  2.     <filter-name>setEncoding</filter-name>   
  3.     <filter-class>com.test.CharFilter</filter-class>   
  4. </filter>   
  5. <filter-mapping>   
  6.     <filter-name>setEncoding</filter-name>   
  7.     <url-pattern>/*</url-pattern>   
  8. </filter-mapping>  
Filter的声明和Servlet的类似,从上面的简单的配置中就可以看到,不做过多说明,主要说下<url-pattern>元素中的参数:
1.REQUEST,当用户直接访问页面时,Web容器将会调用过滤器,如果目标资源是通过RequestDispatcher的includ()或forward()方法访问时,那么不会调用这个过滤器。
2.FORWARD,如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外过滤器不会被调用。
3.INCLUDE,如果目标资源是通过RequestDispatcher的include()方法访问时,调用过滤器,其他不会调用。
4.ERROR,如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用,除此之外不会被调用。
5./*,所有请求都会调用。

过滤器应用的很广,特别是在Spring中,AOP,Acegi都应用到了过滤器的技术,所以,我们可以看出,只有很好的掌握了Servlet的各种技术,我们在后期的学习中才能更加的得心应手。在这里,我只是简单的介绍了过滤器基础的东西,更加高级的,希望与大家一起学习讨论。
原创粉丝点击