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

本文深入探讨了在Tomcat中Valve、Filter和Servlet的调用关系,从源码角度阐述了它们的加载和执行顺序,通过逻辑概念图和调用逻辑图直观展示了各个容器标准Valve的执行流程,以及如何在Filter中执行后续逻辑直至完成整个消息处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值