tomcat内部过滤器采用了责任链的设计模式,

Tomcat的过滤器主要由Filter、FilterChain组成,FilterChain包含一个Filter数组.当Wrapper执行FilterChain的doFilter(request,response)方法时,FilterChain首先调用第一个Filter的doFilter(request,response,filterchain)方法,当第一个filter做完过滤操作后,它又会调用filterchain的doFilter方法,此时filterchain的当前filter已变为第二个filter,第二个filter又执行dofilter方法,依此类推,直至所有过滤器都执行完毕。

  1. public interface Filter {
  2. .....
  3. //执行过滤
  4. public void doFilter ( ServletRequest request, ServletResponse response, throws IOException, ServletException;
  5. }
  6. public interface FilterChain {
  7. public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;
  8. }

FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。ApplicationFilterConfig是其实现类

ApplicationFilterChain在catalina.jar的org.apache.catalina.core包中

  1. class ApplicationFilterChain implements FilterChain {
  2. ..................
  3. private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];
  4. private int pos = 0;
      private int n = 0;
  5. //pos为当前filter的所在位置,n为filters数组的长度
  6. if (pos < n) {
  7. //pos++执行后,把filterchain的当前filter指向下一个
  8. ApplicationFilterConfig filterConfig = filters[pos++];
  9. Filter filter = null;
  10. try {
  11. filter = filterConfig.getFilter();
  12. //filter执行过滤操作
  13. filter.doFilter(request, response, this);
  14. }
  15. ...
  16. }
  17. }
  18. 实例如下:

  19. class SampleFilter implements Filter {
  20. ........
  21. public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
  22. throws IOException, ServletException {
  23. //do something
  24. .....
  25. //request, response传递给下一个过滤器进行过滤
  26. chain.doFilter(request, response);
  27. }
  28. }

先描述tomcat的方法调用序列。

      具体过程如下:
                (1)connector 创建 request 和 response 对象;
                (2)connector 调用 StandardContext 实例的 invoke 方法;
                (3)StandardContext 接着调用其 pipeline 的 invoke 方法,StandardContext 中 pipeline 的 basic valve 是
  StandardContextValve,因此,StandardContext 的 pipeline 会调用 StandardContextValve 的 invoke 方法;
                (4)StandardContextValve 的 invoke 方法获取 wrapper 处理请求,调用 wrapper 的 invoke 方法;
                (5)StandardWrapper 是 Wrapper 接口的标准实现,StandardWrapper 实例的 invoke 方法会调用其
  pipeline 的 invoke 方法;
                (6)StandardWrapper 的 pipeline 中的 basic valve 是 StandardWrapperValve,因此,会调用其 invoke 方
 法,StandardWrapperValve 调用 wrapper 的 allocate 方法获取 servlet 实例;
                (7)allocate 方法调用 load 方法载入 servlet 类,若已经载入,则无需重复载入;
                (8)load 方法调用 servlet 的 init 方法;
                (9)StandardWrapperValve 调用 servlet 的 service 方法。

StandardWrapperValve中的主要代码如下:

  1. ApplicationFilterChain filterChain =
  2. createFilterChain(request, servlet);
  3. /*略
  4. String jspFile = wrapper.getJspFile();
  5. if (jspFile != null)
  6. sreq.setAttribute(Globals.JSP_FILE_ATTR, jspFile);
  7. else
  8. sreq.removeAttribute(Globals.JSP_FILE_ATTR);
  9. if ((servlet != null) && (filterChain != null)) {
  10. filterChain.doFilter(sreq, sres);
  11. }
  12. sreq.removeAttribute(Globals.JSP_FILE_ATTR);

在StandardWrapperValve的invoke中(也就是上面贴的代码),第10行的代码就是调用servlet的入口,传说中的doFilter()。

Filter过滤器机制的更多相关文章

  1. filter 过滤器(监听)

    Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...

  2. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  3. javaweb学习总结(四十二)——Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. javaWeb学习总结(10)- Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...

  5. JavaWeb(五)Filter过滤器

    Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...

  6. 简易RPC框架-过滤器机制

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  7. javaweb之Filter过滤器详解

    快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...

  8. Filter(过滤器)

    一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...

  9. JavaWeb学习篇--Filter过滤器

    Filter过滤器简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的 java 类实现了这个接口,则把这个java类称之为过滤器Filter. WEB服务器每次在调用 ...

随机推荐

  1. PowerDesigner连接Oracle数据库(32位)反向生成物理数据模型

    PowerDesigner可以连接Oracle数据库进行反向生成物理数据模型,本文演示操作过程. 环境说明: 1)Windows8.1,Oracle11R2 32位. 2)PowerDesigner1 ...

  2. 全面学习ORACLE Scheduler特性(5)Schedules调度Programs执行的Jobs

    3.2 Schedules调度Programs执行的Jobs 通过schedule调度program的执行的job,看到这样的形容是不是让你彻底晕头了,就说明你还是没搞明白10g中SCHEDULERS ...

  3. RabbitMQ~广播消息

    定义 广播消息是指生产者产生的消息将分发给所有订阅这个消息的消费者,而普通的模式是:一批消息可以被多个人共同消费,如consumer1可能消费1,3,5记录,而consumer2可能消费的是2,4,6 ...

  4. Farseer.net轻量级开源框架 入门篇:删除数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 ...

  5. git分支拉取

    假设你已经配置好了各种SSH Key之类并熟悉基本的git创建分支.提交分支命令.比如共有2个分支,自己在一台未配置origin电脑上想要拉取某个分支(dev)到本地.步骤如下:1.新建git项目 与 ...

  6. WEB前端响应式布局之BootStarp使用

    1.Bootstrap简介:1. 概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JavaScript 的 ...

  7. RabbitMQ系列(六)--面试官问为什么要使用MQ,应该怎么回答

    如果简历中有写到使用过RabbitMQ或者其他的消息中间件,可能在MQ方面的第一个问题就是问:为什么要使用MQ 面试官期望的回答 1.项目中有什么业务场景需要用到MQ 2.但是用了MQ,会带来很多问题 ...

  8. centos7+VMware Workstation创建共享文件夹

    1.第一步设置宿主机共享文件夹路径 2.挂载VMware Tools,如下操作会将tools以光盘挂载点的方式进入到系统中. 3.centos7 挂载存有VMware Tools的光盘并进行安装 1) ...

  9. 52.基于doc value正排索引的聚合内部原理

    主要知识点: 本节没有太懂,以后复习时补上       聚合分析的内部原理是什么????aggs,term,metric avg max,执行一个聚合操作的时候,内部原理是怎样的呢?用了什么样的数据结 ...

  10. 【代码段】Android Studio使用DatePicker选择日期

    布局文件中放一个TextView就好了 Java文件如下: public class TestDatePickerActivity extends AppCompatActivity { privat ...