文章目录
上下文
tomcat源码分析共2个阶段
1.tomcat如何接收处理请求源码分析(一)(Connector部分)
2.tomcat如何接收处理请求源码分析(二)(Container部分)本篇
目标:
本文主要分析tomcat
的Container
部分,已经封装好的HttpRequest,经过一层层Valve
一层层filter
最终是如何到达controller
。下图中的2号框和3号框即使本所涉及的范围。
正文
1container
结构分析
valve
(阀门)可以简单理解为过滤器(filter
),阀门和过滤器本来就相似,我们开发过web的同事应该都有使用filter
的经历,比如session
校验,非法请求拦截等一些常用的方案,都可以通过filter
解决。而我们tomcat
层面的valve
也类似于filter
,会对请求进行拦截。那么它和filter
的区别是什么?filter
拦截的目标是 tomcat
的 webapps
下的一个应用 ,而valve
则是属于容器层面的拦截。什么叫容器层面的拦截。我们前面分析过,一个请求最终进入到controller
,首先是经历了connector
对连接处理,然后进入container
容器,而容器内部先是进入最外层的Engine
,,然后进入第二层Host
,然后是Context
,最后是Wrapper
,这是一种嵌套的顺序,类似下图。
2对engine
、host
、context
、wrapper
的理解
容器是一个比较大的概念,以上四个都属于容器,大小不同,容器是针对tomcat内部的组件的抽象。
engine
理解为引擎、host
理解为虚拟主机、context
理解为webapps下的一个文件夹、wrapper
理解为一个controller。这些容器都可以在tomcat
的配置文件server.xml中配置,如下文所示。
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWNING">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Service name="Catalina">
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">//
<Valve className="org.apache.catalina.valves.RemoteIpValve"