关于Filter的一点误解

之前一直以为请求达到Web应用时,经过过滤器1,过滤器2……,处理后产生响应再经过过滤器n……过滤器2,过滤器1。这样的阐述似乎没有问题,但我的理解却有问题。比如过滤器1的doFilter方法执行了一个输出语句:System.out.println("hello"),我以为会在请求到达时输出一次,响应发出时输出一次。当时想来这样也不合理,但却没有深入思考。最近,好像才明白教材中那些流程图的真正含义。

 

过滤器执行流程如下:

在调用servlet的service()方法之前,容器会先创建一个filterchain,并把servlet传入这个filterchain对象,作为其内部参数。
创建这个filterchain的时候,会根据请求的uri,把符合条件的filter加入到这个chain里。紧接着就调用这个filterchain的doFilter方法。
这个filterchain的doFilter方法就会按顺序(在web.xml定义的顺序)调用各个filter的doFilter方法。当所有的filter的doFilter方法都调用完以后,才会调用servlet的service方法。
service方法调用结束后会返回上一次的chain.doFilter方法,并执行doFilter方法后面的代码。接着,返回上上一个chain.doFilter方法……
因此,我们的Filter都是在chain.doFilter方法调用之前来处理request请求,在chain.doFilter方法调用之后处理response响应。

示例代码如下:
public class testFilter implements Filter {
    public static int count=0;
    @Override
    public void destroy() {
    }
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
            throws IOException, ServletException {
        count++;
        System.out.println("testFilter:请求到达过滤器");
        chain.doFilter(arg0, arg1);
        System.out.println("testFilter:响应到达过滤器");
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}

posted @ 2016-11-14 21:29  且听风吟-wuchao  阅读(1044)  评论(0编辑  收藏  举报