Tomcat Filter 源码分析

作者: jijs | 来源:发表于2017-08-31 23:50 被阅读257次

    Filter 概述

    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。
    通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

    Filter工作流程图如下:


    Tomcat中的Filter 是采用责任链设计模式 ,下面我们通过源码分析下tomcat中Filter的实现

    StandardWrapperValve.invoke()方法

    创建一个过滤器链,并把待执行的 servlet 对象存放到过滤器链中。

    ApplicationFilterFactory.createFilterChain() 方法

    1. 把要执行的servlet存放到过滤器链中。
    2. 如果没有配置过滤器则return一个空的过滤器链(只包含上面设置的servlet)。
    3. 如果配置过滤器,则把所有配置的过滤器加入到过滤器链中
      3.1 首先判断filter-mapping中配置的dispatcher规则,如果符合则进入下一步
      3.2 然后判断filter-mapping中配置的url-pattern规则,如果符合则添加到过滤器链

    过滤器的顺序是按照web.xml中的先后顺序执行的。

    StandardWrapperValve.invoke()方法


    如果servlet和过滤器链都不为空,则开始调用过滤器链的doFilter() 方法

    ApplicationFilterChain.doFilter()->internalDoFilter()

    pos:为过滤器链中当前执行的过滤器下标。
    n:过滤器链中的过滤器个数。

    每执行一个过滤器则把过滤器链中的post+1(下标),直到所有的过滤器的doFilter方法都调用成功。

    filter.doFilter(request, response, this);
    

    这行代码是责任链设计模式的核心,把当前的过滤链传入到doFilter方法中。
    这样在Filter中进行拦截,通过过滤器判断是否要进行调用下一个过滤器链。


    过滤器链中的所有过滤器的doFilter方法都执行完成后,最后再调用过滤器链中存放的servlet.service()方法。


    想了解更多精彩内容请关注我的公众号

    相关文章

      网友评论

        本文标题:Tomcat Filter 源码分析

        本文链接:https://www.haomeiwen.com/subject/ylthjxtx.html