过滤器Filter

来源:互联网 发布:廖雪峰python教程mobi 编辑:程序博客网 时间:2024/05/29 13:10
一、 过滤器 Filter 
1. why Filter? 
   针对通用WEB服务、功能,透明的处理 

2. 什么是 Servlet Filter? 
     过滤是 Servlet 2.3 版才引入的新特性。过滤器可以认为是实现 Http 请求、响应以及头信息等内容的传送的代码片断。 
     过滤器并不能创建响应,但它可以“过滤”传给 servlet 的请求,还可以“过滤”从 servlet发送到客户端的响应; 
     它不仅能处理静态内容,还可以处理动态内容。换而言之,filter 其实是一个“servlet chaining”(servlet 链)。 
   一个 filter 包括: 
    1) 在 servlet 被调用之前截获; 
    2) 在 servlet 被调用之前检查 servlet request; 
    3) 根据需要修改 request 头和 request 数据; 
    4) 根据需要修改 response 头和 response 数据; 
    5) 在 servlet 被调用之后截获. 

3. 过滤器的生命周期 
   Filter 组件的生命周期与 Servlet 的类似。 
   过滤器有四个阶段(与servlet类似): 
    1) 实例化; 
    2) 初始化(调用init()方法); 
    3) 过滤(调用doFilter()方法); 
    4) 销毁(调用destroy()方法); 

4. Filter编程 
   1)定义Filter(implements Filter) 
   2)配置Filter 
     配置对哪些资源进行过滤(url) 

     <filter> 
        <filter-name>Logger</filter-name>                   //过滤器名 
        <filter-class>com.LoggerFilter</filter-class>       //具体过滤器类 
        <init-param>                                        //初始化参数 
           <param-name>xsltfile</param-name> 
           <param-value>/xsl/stockquotes.xsl</param-value> 
        </init-param> 
     </filter> 
     <filter-mapping>                 
         <filter-name>Logger</filter-name> 
         <url-pattern>/*</url-pattern> //将过滤器应用于Web应用中的每个Web资源;可以只指定某个资源 
     </filter-mapping> 

5. FilterChain 
   1) chain是如何配置,顺序 
      当同一个应用中配置了多个 filter 时,其执行顺序是如何的呢? 
      答:按 web.xml 中<filter-mapping>的顺序来执行的 
   2) chain.doFilter(req, resp) 
      调用下一个Filter,到最后一个Filter则正式调用 TargetServlet 
   3) 调用过程(类似于递归调用) 

6. Filter的类型 
   Filter 有4种类型,主要体现在<filter-mapping>中的<dispatcher>属性: 
   <dispatcher>REQUEST</dispatcher>       默认,客户端的直接的请求,才触发该过滤器 
   <dispatcher>FORWARD</dispatcher>       servlet 调用 rd.forward(req,resp)时触发 
   <dispatcher>INCLUDE</dispatcher>       servlet 调用 rd.include(req,resp)时触发 
   <dispatcher>ERROR</dispatcher>         发生错误,跳转到错误页面时触发