Tomcat的valve、filter和servlet的执行顺序

来源:互联网 发布:淘宝大v达人怎么申请 编辑:程序博客网 时间:2024/06/05 08:51

Tomcatvalvefilterservlet的加载和执行顺序是:valve->filter->servlet。本篇文章从源码分析的角度讲述它们在tomcat中的调用关系。

Tomcat中有四大容器类StandardEngineStandardHostStandardContextStandardWrapper。在每个容器对象里面都有一个pipelinevalve模块。它们是容器类必须具有的模块。容器类生成对象时,都会生成一个pipeline对象,同时,生成一个缺省的valve实现,并将这个标准的valve对象绑定在其pipeline上。每个容器缺省的标准valve分别是:

  • Engineorg.apache.catalina.core.StandardEngineValve

  • Hostorg.apache.catalina.core.StandardHostValve

  • Contextorg.apache.catalina.core.StandardContextValve

  • Wrapperorg.apache.catalina.core.StandardWrapperValve

Pipeline就像是每个容器的逻辑总线。在pipeline上按照配置的顺序,加载各个valve,其中缺省的标准valve处在pipeline的尾端。

先看一下pipelinevalve的逻辑概念图。

先看一下四大容器的标准valve的调用逻辑图。从中可以梳理出标准valve的逻辑。注意此图只是在缺省配置下的状态,也就是说每个pipeline只包含一个标准valve的情况。

图中显示的是各个容器默认的valve之间的实际调用情况。从StandardEngineValve开始,一直到StandardWrapperValve,完成整个消息处理过程。注意每一个上层的valve都是在调用下一层的valve返回后再返回的,这样每个上层valve不仅具有request对象,同时还能拿到response对象。


在最后一个Valve—StandardWrapperValve中会根据Tomcat/conf/web.xmlwebapp/web-info/web.xml中的配置形成一个filter-servlet链,其中servlet在链表的尾端。webapp下的web.xmlfilter配置先于tomcat/conffilter。其中每一个filter都是在下一层的filter返回之后再返回的。所以可以在filter中先调用chain.dofilter()方法来执行后面的逻辑(包括servlet的执行)。在调用又返回当前filter时再处理从servlet中得到的response

参考出处:gearever.iteye.com/blog/1536022


0 0