Tomcat组件阀(Valve)用于对Catalina容器接收到的HTTP请求进行预处理。过滤器是在JavaServlet规范中个提出来的,因此适用于所有的Servlet容器,而Tomcat阀是Tomcat专有的,不能用于Tomcat以外的其他Servlet容器。
Tomcat阀简介
Tomcat阀在不同的容器中的作用范围如下:
Tomcat阀加入到Catalina容器中
容器 |
描述 |
Engine |
加入到Engine中的Tomcat阀可以预处理该Engine接收到的所有HTTP请求 |
Host |
加入到Host中的Tomcat阀可以预处理该Engine接收到的所有Host请求 |
Context |
加入到Context中的Tomcat阀可以预处理该Context接收到的所有HTTP请求 |
所有Tomcat阀都实现了or.apache.Catalina.Valve接口或扩展了org.apache.Catalina.valves.ValveBase类。Tomcat阀主要包括以下几种:
客户访问日志阀(Access LogValve)
远程地址过滤阀(RemoteAddress Filter)
远程主机过滤阀(Remote HostFilter)
客户请求记录阀(RequestDumper)
Tomcat阀用<Valve>元素来过滤,它的形式为:
<ValveclassName=”实现这种阀的类的完整名字” … 其他属性…/>
如果要把Tomcat阀加入到Engine或Host中,则需要在Tomcat的conf/server.xml文件的相应<Engine>或<Host>元素中加入<Valve>元素;如果要把Tomcat阀加入到Conetxt,则需要在Tomcat的conf/server.xml文件的相应<Context>元素中加入<Value>元素,或者在响应Web应用的META-INF/context.xml文件中的<Context>元素中加入<Valve>元素。
客户访问日志阀
客户访问日志阀(Access LogValve)能够将客户的请求信息写到日志文件中,这些日志可以记录网页的访问次数、访问时间、用户的会话活动和用户的安全验证信息等。客户访问日志阀可以加入到Engine、Host或Context容器中,以记录所在容器接收的HTTP请求信息。
客户访问日志阀的<Valve>元素的属性
属性 |
描述 |
className |
指定阀的实现类,这里为org.apache.catalina.valves.AccessLogValve |
directory |
设定存放日志文件的绝对或相对于<CATALINA_HOME>的目录,该属性的默认值为<CATALINA_HOME>/logs |
pattern |
设定日志的格式和内容 |
prefix |
设定日志文件名前缀,默认值为access_log |
resolveHosts |
如果设为true,表示把远程IP地址解析为主机名,如果设为false,表示直接记录远程IP地址,默认值为false |
suffix |
设定日志文件的扩展名,默认值为”” |
<Valve>元素的pattern属性用于设定日志的格式和内容,它有以下可选值
%a:远程IP地址。
%A:本地IP地址。
%b:发送的字节数,不包括HTTP头部。符号”-”表示发送字节为零。
%B:发送的字节数,不包括HTTP头部。
%h:远程主机名。
%H:客户请求所使用的协议。
%l:远程逻辑用户名。
%m:客户请求方式。
%p:接收到客户请求的本地服务器端口。
%q:客户请求中的查询字符串,即HTTP请求的第一行的URI部门的”?”后面的内容。
%r:客户请求的第一行内容(包括请求方式、请求URI及HTTP协议版本)。
%s:服务器响应结果中的HTTP状态码。
%S:用户的SessionID。
%t:时间和日期。
%u:通过安全验证的远程用户名,符号”-”表示不存在远程用户名。
%U:客户请求的URL路径。
%v:本地服务器名。
远程地址过滤器
远程地址过滤器(RemoteAddress Filter)可以根据远程客户的IP地址来决定是否接受客户的请求。在远程地址过滤器中,实现保存了一份被拒绝的IP地址清单和允许访问的IP地址清单。如果客户的IP地址在拒绝清单中,那么这个客户的请求不会被Catalina容器响应;如果客户的IP地址在允许访问清单中,那么这个客户的请求可以被Catalina容器响应。
远程地址过滤器的<Valve>元素的属性
属性 |
描述 |
className |
指定阀的实现类,这里为org.apache.catalina.valves.RemoteAddrValve |
allow |
指定允许访问的客户IP地址,如果此项没有设定,表示只要客户IP地址不再deny清单中,就允许访问,多个IP地址可以以逗号隔开 |
deny |
指定不允许访问的客户IP地址,多个IP地址以逗号隔开 |
若一个IP地址同时出现在allow清单和deny清单中,则deny有效。
远程主机过滤器
远程主机过滤器可以根据远程客户的主机名,来决定是否接受客户的请求。
客户请求记录器
客户请求记录器用于把客户请求的详细信息记录到日志文件中。客户请求记录器是一个有效的跟踪工具,尤其是当HTTP请求中的Header或Cookie有错误时,它可以跟踪客户请求的详细信息。