过滤器Filter
来源:互联网 发布:近月少女的礼仪 知乎 编辑:程序博客网 时间:2024/06/11 05:30
过滤器是请求和响应之间的一种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中的声明:
- <filter>
- <filter-name>setEncoding</filter-name>
- <filter-class>com.test.CharFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>setEncoding</filter-name>
- <url-pattern>/*</url-pattern>
- </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的各种技术,我们在后期的学习中才能更加的得心应手。在这里,我只是简单的介绍了过滤器基础的东西,更加高级的,希望与大家一起学习讨论。
- 过滤器Filter
- 过滤器Filter
- Filter 过滤器
- 过滤器 filter
- 过滤器filter
- 过滤器,Filter
- 过滤器Filter
- filter--过滤器
- 过滤器Filter
- filter过滤器
- Filter过滤器
- filter过滤器
- Filter过滤器
- Filter过滤器
- Filter 过滤器
- Filter过滤器
- Filter(过滤器)
- filter过滤器
- 职场不得不明白的十大定律
- jquery选择器介绍
- 马化腾关于产品设计与用户体验的培训
- 互联网创业的葵花宝典[藏]
- Linux 的常用命令举例
- 过滤器Filter
- 王冉:写给2009年的创业者们
- 陈小春版韦小宝七个老婆简介
- 课程 Java程序设计12:GUI Based Applications (怀旧版)
- 课程 Java程序设计13:Threads (怀旧版)
- 齐纳二极管
- 天价手袋心理学
- java.lang.NoSuchMethodError: javax.servlet.JSP.PageContext.getELContext()LJAVAx/el/ELContext
- 课程 Java程序设计14:Advanced I/O (怀旧版)