zoukankan      html  css  js  c++  java
  • tomcat源码阅读之过滤器

    一、Servlet过滤器:

    1、介绍:

    Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。

    Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;

    在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。

    过滤器的工作流程:

     2、接口:

     

    init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml 文件中Servlet过滤器的初始化参数。

    doFilter(ServletRequest, ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器。

    注意:在doFilter中一定要调用chain.doFilter()调用后续过滤器以及调用servlet.service,否则会导致其他过滤器和servlet.service方法得不到执行;

    destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源。

    3、配置:

    使用过滤器还需要进行在web应用的WEB-INF/web.xml文件中进行配置,一般需要配置filter和filter-mapping,当有多个过滤器串联时就需要多个这样的配置;示例如下:

    <filter>  

        <filter-name>authority</filter-name>  

        <filter-class>com.util.AuthorityFilter</filter-class> 

        <init-param>

            <param-name>blacklist</param-name>

            <param-value>someone</param-value>

        </init-param>

    </filter>  

    <filter-mapping>  

         <filter-name>authority</filter-name>  

         <url-pattern>/pages1/*</url-pattern>

    </filter-mapping>

    二、Tomcat实现源码分析:

     

    1、FilterDef类示例代表了一个过滤器的配置定义,配置定义文件WEB-INF/web.xml中定义了过滤器的相关信息,webRuleSet.java中就有对这个配置进行解析的代码,如下:

     

    2、ApplicationFilterConfig实现了FilterConfig接口,封装了一个FilterDef类的实例,在getFilter方法返回一个过滤器Filter的实例,根据FilterDef信息创建Filter实例;

    3、ApplicationFilterChain实现了FilterChain接口,表示过滤器链,FilterChain接口只定义了doFilter一个方法,ApplicationFilterChain.doFilter方法中调用了internalDoFilter方法,internalDoFilter方法依次调用过滤器链中的所有过滤器的doFilter方法,调用完成后再调用servlet.service方法;

     

    在过滤器的doFilter方法中要调用chain.doFilter方法调用链中的下一个过滤器,否则后面的过滤器均无法得到执行;

     

    过滤器链执行完后再调用servlet.service方法执行servlet;

    4、StandardWrapperValve.invoke方法中创建ApplicationFilterChain实例,并调用其doFilter方法完成对过滤器链的调用和servlet.service调用;在createFilterChain中首先创建ApplicationFilterChain实例,然后从context中查找与当前request路径相符或者servlet名称相符的过滤器,添加到这个ApplicationFilterChain实例中并返回,代码如下:

     

  • 相关阅读:
    15 Action View 以及监听 的使用
    15 ActionProvider代码例子
    15 ActionBar 总结
    15 Actionbar的显示和隐藏
    14 fragment传值
    14 fragment 创建
    14 Fragment 注意点
    14 Fragment 碎片总结
    GSON TypeToken 解决泛型问题
    Intent传递对象——Serializable和Parcelable区别
  • 原文地址:https://www.cnblogs.com/laoxia/p/7998786.html
Copyright © 2011-2022 走看看