过滤器工作原理

来源:互联网 发布:notepad整理代码js 编辑:程序博客网 时间:2024/05/22 16:02
一、过滤器工作原理
    当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。


二、Filter简介:

过滤器通常也被称作拦截器
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

Web浏览器-->Web服务器-->过滤器-->Web资源JSP、Servlet、Html-->过滤器-->Web服务器-->Web浏览器


三、Filter是如何实现拦截的?
1、Filter接口中有一个doFilter方法,开发人员编写的Filter需要实现此方法
2、

WEB服务器每次在调用servlet的service方法之前,会在xml文件中
查找当前url地址是否被拦截,如果有,会调用对应的filter对象的doFilter方法

3、
编写好的Filter必须在web.xml中做映射,说明拦截的url地址,此
filter才能起作用


web服务器在调用doFilter方法时,会传递一个filterChain对象进来,
filterChain对象是filter接口中最重要的一个对象,它也提供了一个
doFilter方法,开发人员可以根据需求决定是否调用此方法,调用
该方法,相当于过滤器放行,web服务器就会继续调用servlet的
     service方法,即web资源就会被访问,否则web资源不会被访问。

四、实现第一个Filter程序
Filter开发分为二个步骤:

1、编写java类实现javax.servlet.Filter接口,并实现其doFilter方法。

2、在 web.xml 文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源、



Filter链
1、在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。


2、web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,相当于Filter链的当前拦截器放行,web服务器会访问下一个Filter
3、当链上所有的Filter都放行了,web服务器才会访问目标资源

五、Filter的生命周期
1、Init方法
服务器创建一个Filter对象时会自动调用对象的init方法
通过init(FilterConfig filterConfig)方法可以获得Filter的初始化参数
2、destroy方法
在Web容器卸载 Filter 对象之前被调用,该方法主要用于释放Filter
占用的资源



六、方案
1、统一全站字符编码的过滤器response.setCharacterEncoding(“utf-8”);

response.setContentType(“text/html;charset=utf-8”);

2、禁止浏览器缓存所有动态页面的过滤器

有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

response.setDateHeader("Expires",-1);

response.setHeader("Cache-Control","no-cache");

response.setHeader("Pragma","no-cache");

并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。

Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面


Cache-Control响应头有两个常用值:

no-cache指浏览器不要缓存当前页面。

max-age:xxx指浏览器缓存页面xxx秒。

3、控制浏览器缓存页面中的静态资源的过滤器


场景:有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。对有可能需要缓存的资源进行拦截
通过设置Expires头通知浏览器将页面进行缓存
通过读取配置文件获得不同格式文件的缓存时间


4、实现用户自动登陆的过滤器


在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。



编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie来,如果有,则调用dao查询
cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。


七、Filter的部署—注册Filter

        
   testFitler   org.test.TestFiter
  

     word_file
    
/WEB-INF/word.txt  




用于为过滤器指定一个名字,该元素的内容不能为空。

元素用于指定过滤器的完整的限定类名。

元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。


八、Filter的部署—映射Filter
1、元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
子元素用于设置filter的注册名称

设置 filter 所拦截的请求路径(过滤器关联的URL样式)

指定过滤器所拦截的Servlet名称

指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置
多个 子元素用来指定 Filter 对资源的多种调用方式进行拦截

2、 子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
转载地址:http://blog.sina.com.cn/s/blog_ab45663c01019a88.html