在上一篇的连接器学习中,我们很容易就能发现Tomcat的层次结构非常清晰,由上到下依次为:Server .Service.Connector(Engine).Host.Context,这些组件组合在一起,可以精确的对客户的请求进行处理。其实,在Tomcat中,有一个东东也给我留下了很深刻的印象,它就是标准Tomcat6内置的高级特性之一---阀。
可以简单地理解,阀就是一个过滤器,它由引擎来管理,可以嵌入到<Engine>.<Host>.<Context>容器中,它可以截获任何的输入请求和输出响应,由下图我们可以很清晰的看出阀的位置:
(一般的请求/响应流程)
当然,阀也有类别,我今天要说的就包括三类阀:访问日志阀.单点登录阀.请求过滤;输入请求->Engine->Host->Context输出响应<-Engine<-Host<-Context(加入阀之后的请求/响应流程)输入请求->Engine->阀->Host->Context输出响应<-Engine<-阀<-Host<-Context
1.访问日志阀就是启用日志请求,比如请求的资源网址,请求的日期和时间,日志的范围取决于访问日志阀插入的位置,如果你要在一个特定的引擎中跟踪所有的资源访问,那么就需要把阀放到<Engine>组件中,就是在$CATALINA_HOME/conf/server.xml的Engine组件中,如果你要在所有Web应用程序的虚拟主机上记录所有的访问资源日志,你需要把阀放到<Host>组件中,如果要在指定的Web应用程序中记录所有的访问日志,那么就应该把他放到<Context>组件中。
2. 单点登录阀就是通过用户输入一次密码来改善用户体验,即使用户可以再同一台主机上访问到不同的Web应用程序,在说明单点登录之前,我们先谈一下多次登录的情况,在Tomcat中多次登录的配置主要是在相应的应用程序下的/WEB-IN/web.xml文件中。
这个是基于BASIC认证的配置:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name></realm-name>
</login-config>
这个是基于FORM认证的配置:
<login-config>
<auth-method>FORM</auth-method>
<realm-name></realm-name>
</login-config>
这样当用户在敲入相应的url时,就会出现相应的界面需要用户输入用户名和密码来验证,我们接着来看单点登录的实现:
单点登录更简单了,只需要一句足以:
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
加入这一句到相应的位置,比如我们要实现某个虚拟主机上的单点登录,只需要把他放在<Host></Host>中,就OK了。
3.请求过滤器就是启用基于IP地址或主机名称过滤输入请求。很实用吧!!!他包括两方面:1.远程地址过滤器;2.远程主机过滤器;这两个都不用解释了吧!直接来配置。举个例子:
同样的在你的<Host></Host>中添加以下的阀
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="*" deny="*"/>
其中*代表的就是你允许/过滤的主机或者IP,比如你可以设置第二个*为127.0.0.1,那么会出现什么情况呢?你本机要访问的页面就会显示一个空白页面了!所以说请求过滤器是一种很不错的实现安全策略的方式,当然在物理服务器层过滤或使用路由器的硬件过滤也很好了!!!
好了,今天的阀整理就到这吧!!!