Tomcat的valve、filter和servlet的执⾏顺序
Tomcat中valve、filter和servlet的加载和执⾏顺序是:valve->filter->servlet。本篇⽂章从源码分析的⾓度讲述它们在tomcat中的调⽤关系。Tomcat中有四⼤容器类StandardEngine,StandardHost,StandardContext及StandardWrapper。在每个容器对象⾥⾯都有⼀个pipeline及valve模块。它们是容器类必须具有的模块。容器类⽣成对象时,都会⽣成⼀个pipeline对象,同时,⽣成⼀个缺省的valve实现,并将这个标准
的valve对象绑定在其pipeline上。每个容器缺省的标准valve分别是:
Engine:org.StandardEngineValve
Host:org.StandardHostValve
Context:org.StandardContextValveservlet和tomcat的关系
Wrapper:org.StandardWrapperValve
Pipeline就像是每个容器的逻辑总线。在pipeline上按照配置的顺序,加载各个valve,其中缺省的标准valve处在pipeline的尾端。
先看⼀下pipeline及valve的逻辑概念图。
先看⼀下四⼤容器的标准valve的调⽤逻辑图。从中可以梳理出标准valve的逻辑。注意此图只是在缺省配置下的状态,也就是说每个pipeline只包含⼀个标准valve的情况。
图中显⽰的是各个容器默认的valve之间的实际调⽤情况。从StandardEngineValve开始,⼀直到StandardWrapperValve,完成整个消息处理过程。注意每⼀个上层的valve都是在调⽤下⼀层的valve返回后再返回的,这样每个上层valve不仅具有request对象,同时还能拿到response对象。
在最后⼀个Valve—StandardWrapperValve中会根据Tomcat/l和webapp/l中的配置形成⼀个filter-servlet链,其中servlet在链表的尾端。webapp下的l中filter配置先于tomcat/conf的filter。其中每⼀个filter都是在下⼀层的filter返回之后再返回的。所以可以
在filter中先调⽤chain.dofilter()⽅法来执⾏后⾯的逻辑(包括servlet的执⾏)。在调⽤⼜返回当前filter时再处理从servlet中得到的response。
参考出处:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。