web.xml过滤器 filter

web.xml 过滤器 — 函数回调,指责链模式

1、 Filter作用 
当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件web.xml设置的过滤规则,能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。 —— filter实际是一个servlet chaining(servlet 链)

  • 在servlet被调用之前截获;

  • 在servlet被调用之前检查servlet request;

  • 根据需要修改request头和request数据;

  • 在servlet被调用之后截获.

  • 根据需要修改response头和response数据;

2、 过滤器生命周期的四个阶段:

  1. 实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。

  2. 初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。

  3. 过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。

  4. 销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。

3、 过滤器接口介绍

  • init(用来初始化)

  • dofilter(用来执行具体的操作) 
    此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤器,如果是最后一个过滤器,则下一个就调用目标资源。

  • destory(用来销毁)

4、拦截方式

  • request过滤器(默认):只有直接访问该目标资源时执行。包括:在地址栏中直接访问、表单提交、超链接、重定向

  • forward过滤器:转发访问执行过滤器。包括RequestDispatcher#forward()方法,标签都是转发访问;

  • include过滤器:包含访问执行过滤器。包括RequestDispatcher#include()方法,标签都是包含访问;

  • error过滤器:配置,出现该异常代码时,执行过滤器。

     1 <filter>
     2         <filter-name>patronliFilter</filter-name>//定义名字  
     3         <filter-class>com.servlet.DemoFilter</filter-class>//实现类  
     4 </filter>  
     5 <filter-mapping>
     6         <filter-name>DemoFilter</filter-name>  
     7         <url-pattern>/*</url-pattern>  
     8         <!-- 过滤器拦截规则:request过滤器,include过滤器,forward过滤器,error过滤器 -->
     9         <dispatcher>REQUEST</dispatcher>  
    10         <dispatcher>FORWARD</dispatcher>  
    11 </filter-mapping>  
    12 <!-- 如果想要配置多个拦截器,可以依次向下写 -->
     1 import javax.servlet.Filter;        //过滤器接口
     2 import javax.servlet.FilterChain;   //过滤器链接口
     3 import javax.servlet.FilterConfig;  //过滤器配置接口,getInitParameter方法用于获取web.xml中的初始化参数
     4 
     5 public class DemoFilter implements Filter{
     6     protected FilterConfig config;    
     7     protected String encoding;
     8 
     9     @Override //初始化的方法
    10     public void init(FilterConfig config) throws ServletException {
    11        this.config=config;
    12        this.encoding = config.getInitParameter("encoding"); //通过init-param设置参数,在init中取得
    13     }
    14 
    15     @Override //执行过滤的方法
    16     public void doFilter(ServletRequest arg0, ServletResponse arg1,
    17             FilterChain arg2) throws IOException, ServletException {
    18         request.setCharacterEncoding(encoding);
    19         System.out.println("Do...before..");  
    20         chain.doFilter(request, response); //由该方法进入下一过滤链。(filter拦截栈,后进先出)
    21         System.out.println("Do..after...");  
    22     }
    23 
    24     @Override //销毁的方法
    25     public void destroy() {
    26     }
    27 }

    引用:web.xml之过滤器详解

    引用:JavaWeb过滤器和监听器详解

 

欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友

-- 星河有灿灿,愿与之辉

原文地址:https://www.cnblogs.com/kiqi/p/10454765.html