无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

对 WEB 过滤器的思考

Posted on 2009-08-26 23:28 Gavin.lee 阅读(363) 评论(0)  编辑  收藏 所属分类: web 积累(前端 + 后台)

过滤器基本概念:

过滤器能够对目标资源的请求和响应进行截取,在过滤器中对用户请求进行统一处理。

 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查

进入这些资源的请求信息。过滤器是双向的,容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将

把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源

对请求作出响应时候,容器同样会将响应先转发给过滤器,再过滤器中,你可以对响应的内容进行转换,然后再将响应发送到客户端


过滤器的构造的全面解析:

任何一个过滤器,都要实现Filter接口,重写init,doFilter,destory方法。

public void init(FilterConfig config) throws ServletException {}

init会在容器初始化时被调用

init方法只会在该Filter第一次被调用时初始化。对于简单的过滤器,可提供此方法的一个空体,但有两个原因需要使用init。首先,FilterConfig对象提

供对servlet环境及web.xml文件中指派的过滤器名的访问。因此,普遍的办法是利用init将FilterConfig对象存放在一个字段中,以便doFilter方法能够访

问servlet环境或过滤器名。其次,FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参

数。

FilterConfig接口:

javax.servlet.FilterConfig接口类似于javax.servlet.ServletConfig接口,用于在过滤器初始化时,向其传递信息。ilterConfig

接口有容器实现,容器将其作为参数传入过滤器对象的init()方法中。在FilterConfig接口,定义了4个方法:

·public java.lang.String getFilterName()

得到描述符中指定的过滤器的名字。
 

·public java.lang.String getInitParameter(java.lang.String name)

  返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null.
 

·public java.util.Enumeration getInitParameterNames()

  返回过滤器的所有初始化参数的名字的枚举集合。
 

·public ServletContext getServletContext()

  返回Servlet上下文对象的引用。


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {}

1.ServletRequest对象,此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问,多数情况下,需要将

ServletRequest对象构造成HttpServletRequest对象。

2.ServletResponse对象,简单过滤器则忽略该对象。

3.FilterChain对象,在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被

激活。

对于doFilter方法,是每次请求与此过滤器相关的servlet或JSP页面都会调用的方法。除了在两个情形下要使用它以外,通常忽略这个参数。首先,如

果希望完全阻塞对相关servlet或JSP页面的访问。可调用response.getWriter并直接发送一个响应到客户机。其次,如果希望修改相关的servlet或JSP页

面的输出,可把响应包含在一个收集所有发送到它的输出的对象中。然后,在调用serlvet或JSP页面后,过滤器可检查输出,如果合适就修改它,

之后发送到客户机。

public void destroy() {}

此方法在利用一个给定的过滤器对象永久地终止服务器(如关闭服务器)时调用。大多数过滤器简单地为此方法提供一个空体,不过,可利用它

来完成诸如关闭过滤器使用的文件或数据库连接池等清除任务。

说说FilterChain对象的doFilter方法,Filter接口的doFilter方法以一个FilterChain对象作为它的第三个参数。在调用该对象的doFilter方法时,激活下一个

相关的过滤器。这个过程一般持续到链中最后一个过滤器为止。在最后一个过滤器调用其FilterChain对象的doFilter方法时,激活servlet或页面自身。

但是,链中的任意过滤器都可以通过不调用其FilterChain的doFilter方法中断这个过程。在这样的情况下,不再调用JSP页面的serlvet,并且中断此调

用过程的过滤器负责将输出提供给客户机。

web.xml中对Filter的标准配置

    <filter>
        
<filter-name>EncodingUTF8</filter-name>
        
<filter-class>yixun.wap.filter.SetCharacterEncodingFilter</filter-class>
        
<init-param>
            
<param-name>encoding</param-name>
            
<param-value>UTF-8</param-value>
        
</init-param>    
    
</filter>
    
<filter-mapping>
        
<filter-name>EncodingUTF8</filter-name>
        
<url-pattern>*.jsp</url-pattern>    
        
<dispatcher>REQUEST</dispatcher>    
    
</filter-mapping>


注:
默认情况下,过滤器是按照配置文件中添加的顺序应用于收到的数据。

激活器servlet

要传递参数的时候最好使用form进行传参,如果使用链接的话当中文字符的时候过滤器转码是不会起作用的,还有就是页面上form的method也要设

置为post,不然过滤器也起不了作用。

过滤器的工作方式:

一:request过滤器
请求直接从客户端发过来
通过在<dispatcher>元素中指定值REQUEST,或者不写任何<dispatcher>元素的方式指定

二:forward过滤器
web组件使用forward()调用匹配<url-pattern><servlet-name>
这通过在<dispatcher>元素中设定值FORWARD指定

三:include过滤器
web组件使用include()调用匹配<url-pattern><servlet-name>
这通过在<dispatcher>元素中设置值INCLUDE指定

四:error过滤器
请求使用在“错误处理”中描述的错误机制进行处理,让错误资源匹配<url-pattern>。这通过在<dispatcher>元素中设置值ERROR指定

    <filter>
        
<filter-name>ErrorPage</filter-name>
        
<filter-class>yixun.wap.filter.ErrorPageFilter</filter-class>
    
</filter>
    
<filter-mapping>
        
<filter-name>ErrorPage</filter-name>
        
<url-pattern>/error.jsp</url-pattern>
        
<dispatcher>ERROR</dispatcher>
    
</filter-mapping>
    
<error-page>
        
<exception-type>NullPointerException</exception-type>
        
<location>/error.jsp</location>
    
</error-page>

    
<error-page>
        
<error-code>500</error-code>
        
<location>/error.jsp</location>
    
</error-page>

对于上面配置,当出现空指针,或空指针时,就会跳转到error.jsp页面,在访问error.jsp页面前,由于对error.jsp进行了过滤,先执行ErrorPageFilter,然后转向error.jsp

如果我们实际访问时,如果这个页面中有response.sendError(500,"出错了!"),或者手动抛出空指针时,;那么该错误页面仍然会被调用,过滤器也会工作。

过滤器的实践:

一:统一过滤HTTP请求(响应)头(如:使浏览器不缓存页面的过滤器  )

二、权限控制(对不同角色在系统中跳转进行检查控制)

三、字符编码的过滤器 (对post数据起效)

四、资源保护过滤器 (检测用户是否登陆的过滤器 )  

五、阻塞请求


参考文献:http://www.vipcn.com/wangluobiancheng/JSP/servletheJSPguoluqiFilter.html 


只有注册用户登录后才能发表评论。


网站导航: