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 {
        }
    }
    
    
  • 相关阅读:
    kendo DataSource
    动态改变kendoGrid的数据、列和基础设置
    kendoValidator 验证
    块级元素的水平、垂直居中
    kendoUpload 上传控件
    916数据结构额外考题
    916 数据结构与算法考纲
    英语六级作文翻译
    考研线性代数
    蓝牙室内定位技术原理
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6063530.html
Copyright © 2011-2022 走看看