zoukankan      html  css  js  c++  java
  • 关于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 {
        }
    }
    
    
  • 相关阅读:
    iOS_SN_地图的使用(3)
    iOS_SN_地图的使用(2)
    iOS_SN_百度地图基本使用(1)
    iOS_SN_CoreData(二)
    iOS_SN_CoreDate(一)封装使用
    iOS_SN_UITableView的优化
    阿里云 单表备份 恢复
    svn 彻底删除文件、文件夹
    @去除
    服务器安全保护
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6063530.html
Copyright © 2011-2022 走看看