Tomcat阀即Value,是Tomcat的专有组件。顾名思义,它就好比是一道阀门,数据流在它的管道内流过,进行过滤处理。因此阀的作用是对Catalina容器接受到的HTTP进行过滤处理。
Tomat阀基本原理
据前文可知,Tomcat的value组件可以添加在Engine,Host,Context元素中。添加到其中的Value,用于对其所在的组件接收到的所有HTTP请求进行处理。例如,Engine中的Value会对Engine接收到的所有请求进行处理。
添加Value组件前后,HTTP请求和响应的流程如下图:
通常情况下,当一个用户请求HTTP连接时,会依次从Engine传递到Host,再传递到Context,然后依次返回响应。当为这些组件添加了Value组件以后,在经过每一个组件时,都会经过各自Value的处理。Engine中的Value会处理当前所有Context的请求,范围由大到小,而且,只有这些添加了Value的容器才会进行处理,Value可以添加也可以不添加。
Tomcat阀家族关系
根据Value的配置属性可知,添加一个Value需要指定className属性,即工作的Value类。Tomcat定义了Value的家族,其家族关系如图:
从图中可以看出,核心是ValueBase,所有的Value类都继承自这个抽象类。该类实现了三个接口Contained,Value和MbeanRegistration。Contained表明了Value属于容器,Value是阀的最顶层接口,定义了Value必须实现的函数。
Value实现类共有以下几种:
信息记录:AccessLogValue,ExtendedAccessLogValue,FastCommonAccessLogValue, JDBCAccessLogValue,ErrorReportValue, RequestDumperValue;
访问控制: RemoteAddrValue,RemoteHostValue,SingleSignOn;
管理控制: PersistentValue
除此之外,还有其他的一些实现,如Cluster的ReplicationValue。开发者也可以实现自己的Value类。这些Value类都重写了核心函数invoke(),分别用于实现不同的功能。具体的实现方法可以自行查阅源代码,这里不再继续作分析。
转载于:https://blog.51cto.com/boboha521/926527