Java中Servlet Filter生命周期以及例子

web.xml 中声明的每个filter在每个虚拟机中仅仅只有一个实例,因此它的生命周期分为下面4个阶段。

Filter生命周期

1. 加载和实例化

Web 容器启动时,即会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter。

2. 初始化

Web 容器调用 init(FilterConfig) 来初始化过滤器。容器在调用该方法时,向过滤器传递 FilterConfig 对象,FilterConfig 的用法和 ServletConfig 类似。利用 FilterConfig 对象可以得到 ServletContext 对象,以及在 web.xml 中配置的过滤器的初始化参数。在这个方法中,可以抛出 ServletException 异常,通知容器该过滤器不能正常工作。此时的 Web 容器启动失败,整个应用程序不能够被访问。实例化和初始化的操作只会在容器启动时执行,而且只会执行一次。

3. doFilter

doFilter 方法类似于 Servlet 接口的 service 方法。当客户端请求目标资源的时候,容器会筛选出符合 filter-mapping 中的 url-pattern 的 filter,并按照声明 filter-mapping 的顺序依次调用这些 filter 的 doFilter 方法。在这个链式调用过程中,可以调用 chain.doFilter(ServletRequest, ServletResponse) 将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用 RequestDispatcher 的 forward 和 include 方法,以及 HttpServletResponse 的 sendRedirect 方法将请求转向到其它资源。需要注意的是,这个方法的请求和响应参数的类型是 ServletRequest  和 ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。

4. 销毁

Web 容器调用 destroy 方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。

例子

//HttpFilter.java
public class HttpFilter implements Filter {  
  
    @Override  
    public void destroy() {  
        System.out.println("过滤器生命终止");  
    }  
  
    @Override  
    public void doFilter(ServletRequest arg0, ServletResponse arg1,  
            FilterChain arg2) throws IOException, ServletException {  
        HttpServletRequest req = (HttpServletRequest)arg0;  
        // 打印请求的URL  
        System.out.println("filter1 " + req.getRequestURL());  
        arg2.doFilter(arg0, arg1);  
    }  
  
    @Override  
    public void init(FilterConfig arg0) throws ServletException {  
        System.out.println("过滤器生命开始");  
          
        String filterName = arg0.getFilterName();  
        System.out.println("过滤器名为 " + filterName);  
          
        // 遍历过滤器中的参数和对应值  
        Enumeration<String> initParas = arg0.getInitParameterNames();  
        String paraName;  
        String paraValue;  
        while (initParas.hasMoreElements()) {  
            paraName = initParas.nextElement();  
            paraValue = arg0.getInitParameter(paraName);  
            System.out.println(paraName + " = " + paraValue);  
        }  
    }  
}
//web.xml
<filter>  
  <filter-name>httpFilter</filter-name>  
  <filter-class>com.filter.HttpFilter</filter-class>  
    <init-param>  
        <param-name>creater</param-name>  
        <param-value>51gjie</param-value>  
    </init-param>  
    <init-param>  
        <param-name>createrDate</param-name>  
        <param-value>2017-05-20</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
  <filter-name>httpFilter</filter-name>  
  <url-pattern>/*</url-pattern>  
</filter-mapping>

服务器启动时,可以在控制台中看到:

过滤器生命开始  
过滤器名为 httpFilter  
creater = 51gjie  
createrDate = 2017-08-29 

访问http://localhost:8080/servletDemo/ 

filter1 http://localhost:8080/servletDemo/  

我们停止tomcat服务器,控制台可以看到

过滤器生命终止  

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。