阀门组件

目录

简介

Valve 元素表示将插入到关联的 Catalina 容器(EngineHostContext)的请求处理管道中的组件。各个 Valve 具有不同的处理能力,如下文分别进行描述。

以下描述使用变量名称 $CATALINA_BASE 来指代大多数相对路径解析所针对的基础目录。如果您尚未通过设置 CATALINA_BASE 目录为 Tomcat 配置多个实例,则 $CATALINA_BASE 将设置为 $CATALINA_HOME 的值,即您已将 Tomcat 安装到的目录。

访问日志记录

访问日志记录由实现 org.apache.catalina.AccessLog 接口的 Valve 执行。

访问日志阀门

简介

Access Log Valve 创建的日志文件格式与标准 Web 服务器创建的日志文件格式相同。这些日志随后可由标准日志分析工具进行分析,以跟踪页面点击次数、用户会话活动等。此 Valve 使用自包含逻辑来写入其日志文件,该日志文件每天午夜会自动滚动更新。(访问日志记录的基本要求是低开销地处理大量连续数据流。此 Valve 不使用 Apache Commons Logging,从而避免了额外的开销和潜在的复杂配置)。

Valve 可与任何 Catalina 容器(ContextHostEngine)相关联,并将记录该容器处理的所有请求。

在将某些请求传递给容器之前,Tomcat 可能会处理这些请求。这些请求包括从 /foo 重定向到 /foo/,以及拒绝无效请求。在 Tomcat 可以识别将处理请求的 Context 的情况下,请求/响应将记录在与 ContextHostEngine 关联的 AccessLog(s) 中。在 Tomcat 无法识别将处理请求的 Context 的情况下,例如在 URL 无效的情况下,Tomcat 将首先在 Engine 中查找,然后查找 Engine 的默认 Host,最后查找默认 Host 的 ROOT(或默认)Context 以获取 AccessLog 实现。Tomcat 将使用找到的第一个 AccessLog 实现来记录在传递给容器之前被拒绝的那些请求。

输出文件将放置在 directory 属性给定的目录中。该文件的名称由配置的 prefix、时间戳和 suffix 连接而成。可以使用 fileDateFormat 属性设置文件名中时间戳的格式。如果通过将 rotatable 设置为 false 来关闭文件轮换,则将省略此时间戳。

警告:如果使用了多个 AccessLogValve 实例,则应将其配置为使用不同的输出文件。

如果使用了 sendfile,则响应字节将在线程中异步写入,并且访问日志阀将不知道实际写入的字节数。在这种情况下,将记录传递给 sendfile 线程以进行写入的字节数在访问日志阀中。

属性

访问日志阀支持以下配置属性

属性 说明
buffered

标志,用于确定是否将日志缓冲。如果设置为 false,则在每个请求之后将写入访问日志。默认值:true

className

要使用的实现的 Java 类名。必须将其设置为 org.apache.catalina.valves.AccessLogValve 才能使用默认访问日志阀。

condition

conditionUnless 相同。提供此属性是为了向后兼容。

conditionIf

打开条件记录。如果设置,只有当 ServletRequest.getAttribute() 不为空时,请求才会被记录。例如,如果此值被设置为 important,则只有当 ServletRequest.getAttribute("important") != null 时,特定请求才会被记录。使用过滤器是设置/取消设置 ServletRequest 中属性的简单方法,可用于许多不同的请求。

conditionUnless

打开条件记录。如果设置,只有当 ServletRequest.getAttribute() 为空时,请求才会被记录。例如,如果此值被设置为 junk,则只有当 ServletRequest.getAttribute("junk") == null 时,特定请求才会被记录。使用过滤器是设置/取消设置 ServletRequest 中属性的简单方法,可用于许多不同的请求。

directory

此阀门创建的日志文件所在的目录的绝对或相对路径名。如果指定相对路径,则解释为相对于 $CATALINA_BASE。如果未指定目录属性,则默认值为“logs”(相对于 $CATALINA_BASE)。

encoding

用于写入日志文件的字符集。空字符串表示使用默认字符集。默认值:UTF-8。

fileDateFormat

允许在访问日志文件名中使用自定义时间戳。每当格式化的时间戳更改时,文件就会轮转。默认值为 .yyyy-MM-dd。如果您希望每小时轮转一次,请将此值设置为 .yyyy-MM-dd.HH。日期格式将始终使用语言环境 en_US 进行本地化。

ipv6Canonical

标志,用于确定是否应以 RFC 5952 定义的规范表示格式表示 IPv6 地址。如果设置为 true,则 IPv6 地址将以规范格式写入(例如 2001:db8::1:0:0:1::1),否则将以完整格式表示(例如 2001:db8:0:0:1:0:0:10:0:0:0:0:0:0:1)。默认值:false

locale

用于格式化访问日志行中时间戳的语言环境。使用显式 SimpleDateFormat 模式(%{xxx}t)配置的所有时间戳都将在此语言环境中进行格式化。默认情况下,使用 Java 进程的默认语言环境。不支持在 AccessLogValve 初始化后切换语言环境。使用通用日志格式 (CLF) 的所有时间戳始终以语言环境 en_US 进行格式化。

maxDays

轮转访问日志将被保留的最大天数,然后删除。如果未指定,将使用默认值 -1,这意味着永远不删除旧文件。

maxLogMessageBufferSize

日志消息缓冲区通常会被回收和重新使用。为了防止过度使用内存,如果缓冲区增长超过此大小,它将被丢弃。默认值为 256 个字符。这应该设置为大于典型的访问日志消息大小。

pattern

一种格式化布局,用于标识要记录的请求和响应中的各种信息字段,或单词 commoncombined 以选择标准格式。有关如何配置此属性的更多信息,请参见下文。

前缀

添加到每个日志文件名称开头的前缀。如果未指定,则默认值为“access_log”。

renameOnRotate

对于可轮换日志,默认情况下,活动访问日志文件名称将包含 fileDateFormat 中的当前时间戳。在轮换期间,文件将关闭,并创建一个名称中包含下一个时间戳的新文件并使用它。将 renameOnRotate 设置为 true 时,时间戳不再是活动日志文件名称的一部分。仅在轮换期间关闭文件,然后将其重命名为包含时间戳。这类似于大多数日志框架在执行基于时间轮换时的行为。默认值:false

requestAttributesEnabled

设置为 true 以检查请求属性(通常由 RemoteIpValve 等设置)的存在,这些属性应用于覆盖请求返回的远程地址、远程主机、服务器端口和协议的值。如果未设置属性,或此属性设置为 false,则将使用请求中的值。如果未设置,将使用默认值 false

resolveHosts

此属性不再受支持。请改用连接器属性 enableLookups

如果已将连接器上的 enableLookups 设置为 true,并且想要忽略它,请在 pattern 的值中使用 %a 而不是 %h

rotatable

确定是否应进行日志轮换的标志。如果设置为 false,则此文件永远不会轮换,并且会忽略 fileDateFormat。默认值:true

后缀

添加到每个日志文件名称末尾的后缀。如果未指定,则默认值为 ""(零长度字符串),这意味着不会添加后缀。

pattern 属性的值由文本字符串文字组成,与以 “%” 字符为前缀的模式标识符组合,以用当前请求和响应中的相应变量值进行替换。支持以下模式代码

  • %a - 远程 IP 地址。另请参见下面的 %{xxx}a
  • %A - 本地 IP 地址
  • %b - 发送的字节数(不包括 HTTP 头),如果为零则为 '-'
  • %B - 发送的字节数(不包括 HTTP 头)
  • %D - 处理请求所花费的时间(以微秒为单位)
  • %F - 提交响应所花费的时间(以毫秒为单位)
  • %h - 远程主机名(如果连接器的 enableLookups 为 false,则为 IP 地址)
  • %H - 请求协议
  • %I - 当前请求线程名称(稍后可与堆栈跟踪进行比较)
  • %l - identd 的远程逻辑用户名(始终返回 '-')
  • %m - 请求方法(GET、POST 等)
  • %p - 接收此请求的本地端口。另请参见下面的 %{xxx}p
  • %q - 查询字符串(如果存在,则以 '?' 开头)
  • %r - 请求的第一行(方法和请求 URI)
  • %s - 响应的 HTTP 状态代码
  • %S - 用户会话 ID
  • %t - 日期和时间,采用通用日志格式
  • %T - 处理请求所花费的时间(以秒为单位)
  • %u - 已认证的远程用户(如果有),否则为 '-'(如果需要,则转义)
  • %U - 请求的 URL 路径
  • %v - 本地服务器名称
  • %X - 响应完成后连接状态
    • X = 在响应完成前连接已中止。
    • + = 发送响应后连接可能会保持活动状态。
    • - = 发送响应后连接将关闭。

还支持写入传入或传出标头、Cookie、会话或请求属性以及特殊时间戳格式的信息。它模仿 Apache HTTP Server 日志配置语法。它们中的每一个都可以与不同的 xxx 键一起多次使用

  • %{xxx}a 写入远程地址(客户端)(xxx==remote)或连接对等地址(xxx=peer
  • %{xxx}i 写入名称为 xxx 的传入标头的值(必要时进行转义)
  • %{xxx}o 写入名称为 xxx 的传出标头的值(必要时进行转义)
  • %{xxx}c 写入名称为 xxx 的 Cookie 的值(必要时以逗号分隔并进行转义)
  • %{xxx}r 写入名称为 xxx 的 ServletRequest 属性的值(必要时进行转义,如果请求为 null,则值为 ??
  • %{xxx}s 写入名称为 xxx 的 HttpSession 属性的值(必要时进行转义,如果请求为 null,则值为 ??
  • %{xxx}p 写入本地(服务器)端口(xxx==local)或远程(客户端)端口(xxx=remote
  • %{xxx}t 使用增强型 SimpleDateFormat 模式 xxx 格式化请求结束时的时间戳
  • %{xxx}T 使用单位 xxx 写入处理请求所用的时间,其中有效单位包括毫秒的 ms、微秒的 us 和秒的 s%{s}T 等同于 %T%{us}T 等同于 %D

%{xxx}t 中允许 SimpleDateFormat 支持的所有格式。此外,还添加了以下扩展

  • sec - 自纪元以来的秒数
  • msec - 自纪元以来的毫秒数
  • msec_frac - 毫秒分数

这些格式不能与同一格式标记中的 SimpleDateFormat 格式混合使用。

此外,还可以定义是要记录请求开始时间还是响应结束时间的时间戳

  • begin 或前缀 begin: 选择请求开始时间
  • end 或前缀 end: 选择响应结束时间

通过将多个 %{xxx}t 标记添加到模式,还可以记录两个时间戳。

转义按如下方式应用

  • " 转义为 \"
  • \ 转义为 \\
  • 标准 C 转义用于 \f\n\r\t
  • 任何其他控制字符或代码点高于 127 的字符都使用标准 Java unicode 转义(\uXXXX)进行编码

简写模式 pattern="common" 对应于由 '%h %l %u %t "%r" %s %b' 定义的通用日志格式。

简写模式 pattern="combined"RefererUser-Agent 标头的值(每个都用双引号引起来)附加到 common 模式。

使用未知模式标识符的字段将记录为 ???X???,其中 X 是未知标识符。具有未知模式标识符和 {xxx} 键的字段将记录为 ???

当 Tomcat 在反向代理后面运行时,Access Log Valve 记录的客户端信息可能表示反向代理、浏览器或两者的某种组合,具体取决于 Tomcat 和反向代理的配置。有关 Tomcat 配置选项,请参阅 代理支持代理操作方法。对于使用 mod_jk 的反向代理,请参阅 通用代理 文档。对于其他反向代理,请查阅其文档。

扩展访问日志阀门

简介

扩展访问日志阀扩展了 访问日志阀 类,因此使用了相同的自包含日志记录逻辑。这意味着它实现了许多相同的文件处理属性。与标准 AccessLogValve 的主要区别在于 ExtendedAccessLogValve 创建的日志文件符合 W3C 定义的 扩展日志文件格式 的工作草案。

属性

扩展访问日志阀支持标准 访问日志阀 的所有配置属性。只有用于 classNamepattern 的值不同。

属性 说明
className

要使用的实现的 Java 类名。必须将其设置为 org.apache.catalina.valves.ExtendedAccessLogValve 才能使用扩展访问日志阀。

pattern

一个格式化布局,用于识别要记录的请求和响应中的各种信息字段。有关如何配置此属性的更多信息,请参见下文。

pattern 属性的值由格式标记组成。某些标记需要一个附加前缀。可能的附加前缀是“客户端”的 c、“服务器”的 s、“客户端到服务器”的 cs、“服务器到客户端”的 sc 或“应用程序特定”的 x。此外,某些标记由一个附加选择器完成。有关格式的更多信息,请参阅 W3C 规范

支持以下格式标记

  • bytes - 发送的字节数,不包括 HTTP 标头,如果为零则为 '-'
  • c-dns - 远程主机名(或 IP 地址,如果连接器的 enableLookups 为 false)
  • c-ip - 远程 IP 地址
  • cs-method - 请求方法(GET、POST 等)
  • cs-uri - 请求 URI
  • cs-uri-query - 查询字符串(如果存在,则以 '?' 为前缀)
  • cs-uri-stem - 请求的 URL 路径
  • date - 格林尼治标准时间格式为 yyyy-mm-dd 的日期
  • s-dns - 本地主机名
  • s-ip - 本地 IP 地址
  • sc-status - 响应的 HTTP 状态代码
  • time - 以 HH:mm:ss 格式表示的 GMT 请求服务时间
  • time-taken - 服务请求所花费的时间(以浮点表示的秒)
  • x-threadname - 当前请求线程名称(稍后可与堆栈跟踪进行比较)

对于任何 x-H(XXX),都将从 HttpServletRequest 对象调用以下方法

  • x-H(authType): getAuthType
  • x-H(characterEncoding): getCharacterEncoding
  • x-H(contentLength): getContentLength
  • x-H(locale): getLocale
  • x-H(protocol): getProtocol
  • x-H(remoteUser): getRemoteUser
  • x-H(requestedSessionId): getRequestedSessionId
  • x-H(requestedSessionIdFromCookie): isRequestedSessionIdFromCookie
  • x-H(requestedSessionIdValid): isRequestedSessionIdValid
  • x-H(scheme): getScheme
  • x-H(secure): isSecure

还支持写入有关标头 cookie、上下文、请求或会话属性以及请求参数的信息。

  • cs(XXX) 用于名称为 XXX 的传入请求标头
  • sc(XXX) 用于名称为 XXX 的传出响应标头
  • x-A(XXX) 用于名称为 XXX 的 servlet 上下文属性
  • x-C(XXX) 用于名称为 XXX 的 cookie(如果需要,用逗号分隔)
  • x-O(XXX) 用于名称为 XXX 的所有传出响应标头的连接
  • x-P(XXX) 用于名称为 XXX 的 URL 编码(使用 UTF-8)请求参数
  • x-R(XXX) 用于名称为 XXX 的请求属性
  • x-S(XXX) 用于名称为 XXX 的会话属性

JSON 访问日志阀门

简介

JSON 访问日志阀扩展了 访问日志阀,因此使用了相同的自包含日志记录逻辑。这意味着它实现了相同的文件处理属性。与标准 AccessLogValve 的主要区别在于 JsonAccessLogValve 创建的日志文件遵循 RFC 8259 定义的 JSON 语法。

属性

JSON 访问日志阀支持标准 访问日志阀 的所有配置属性。只有用于 className 的值不同。

属性 说明
className

要使用的实现的 Java 类名称。必须将其设置为 org.apache.catalina.valves.JsonAccessLogValve 才能使用扩展的访问日志阀。

虽然支持的模式与常规 访问日志阀 相同,但有一些区别

  • 请求记录为 JSON 对象。
  • 每个受支持的“%X”单字符模式标识符都会在此对象中生成一个键值对。请参阅下文以了解用于各个模式标识符的键列表。
  • 每个模式标识符使用 %{xxx}X 形式的子键,其中 “X” 为 “a”、“p” 或 “t” 之一,生成 “key-xxx” 形式的键值对。有关用于各个模式标识符的键的列表,请参见下方。
  • 每个模式标识符使用 %{xxx}X 形式的子键,其中 “X” 为 “c”、“i”、“o”、“r” 或 “s” 之一,生成一个子对象。有关指向此子对象的键,请参见下方。子对象中的键是模式中的 “xxx” 子键。
  • 每个不受支持的 “%X” 字符模式标识符使用键 “other-X” 生成键值对。
  • 记录的值与标准 访问日志阀 为相同模式标识符记录的值相同。
  • 任何 “xxx” 子键都会进行 Json 转义。
  • 模式标识符之间的任何逐字文本都会被静默忽略。
用于不会生成子对象的模式标识符的 JSON 对象键如下
  • %a:remoteAddr
  • %A:localAddr
  • %b:size
  • %B:byteSentNC
  • %D:elapsedTime
  • %F:firstByteTime
  • %h:host
  • %H:protocol
  • %I:threadName
  • %l:logicalUserName
  • %m:method
  • %p:port
  • %q:query
  • %r:request
  • %s:statusCode
  • %S:sessionId
  • %t:time
  • %T:elapsedTimeS
  • %u:user
  • %U:path
  • %v:localServerName
  • %X:connectionStatus
用于生成子对象的模式标识符的 JSON 对象键如下
  • %c:cookies
  • %i:requestHeaders
  • %o:responseHeaders
  • %r:requestAttributes
  • %s:sessionAttributes

访问控制

远程地址阀门

简介

远程地址阀允许您将提交此请求的客户端的 IP 地址与一个或多个正则表达式进行比较,并允许请求继续或拒绝处理来自此客户端的请求。远程地址阀可以与任何 Catalina 容器(引擎主机上下文)关联,并且必须接受提交给此容器以进行处理的任何请求,然后才能将其传递。

正则表达式的语法与“标准”通配符匹配的语法不同。Tomcat 使用 java.util.regex 包。有关支持的表达式的详细信息,请查阅 Java 文档。

将属性 addConnectorPort 设置为 true 后,可以附加以分号 (";") 分隔的服务器连接器端口,以允许为每个连接器使用不同的表达式。

通过将属性 usePeerAddress 设置为 true,阀门将在其检查中使用连接对等地址。如果在 Tomcat 前面使用反向代理与 AJP 协议或 HTTP 协议以及 RemoteIp(Valve|Filter) 结合使用,这将与客户端 IP 不同。

拒绝的请求将收到状态代码为 403 的响应。可以使用属性 denyStatus 覆盖此状态代码。

通过将属性 invalidAuthenticationWhenDeny 设置为 true,可以将拒绝请求时的行为更改为不拒绝,而是设置无效的 authentication 标头。这与上下文属性 preemptiveAuthentication="true" 结合使用时很有用。

注意:在将此阀门与 IPv6 地址一起使用时有一个注意事项。此阀门处理的 IP 地址的格式取决于用于获取它的 API。如果使用 Inet6Address 类从 Java 套接字获取地址,其格式将为 x:x:x:x:x:x:x:x。也就是说,本地主机的 IP 地址将为 0:0:0:0:0:0:0:1,而不是更广泛使用的 ::1。请查阅访问日志以了解实际值。

另请参阅:远程主机阀门远程 CIDR 阀门远程 IP 阀门HTTP 连接器配置。

属性

远程地址阀门支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.RemoteAddrValve

allow

远程客户端的 IP 地址与其进行比较的正则表达式(使用 java.util.regex)。如果指定此属性,则远程地址必须匹配才能接受此请求。如果未指定此属性,则将接受所有请求,除非远程地址与 deny 模式匹配。

deny

远程客户端的 IP 地址与其进行比较的正则表达式(使用 java.util.regex)。如果指定此属性,则远程地址不能匹配才能接受此请求。如果未指定此属性,则请求接受仅受 allow 属性控制。

denyStatus

拒绝拒绝的请求时使用的 HTTP 响应状态代码。默认值为 403。例如,可以将其设置为值 404

addConnectorPort

将服务器连接器端口附加到客户端 IP 地址,并用分号 (";") 分隔。如果将其设置为 true,则使用 allowdeny 配置的表达式将与 ADDRESS;PORT 进行比较,其中 ADDRESS 是客户端 IP 地址,而 PORT 是接收请求的 Tomcat 连接器端口。默认值为 false

invalidAuthenticationWhenDeny

当请求应该被拒绝时,不要拒绝,而是设置一个无效的 authentication 标头。仅当上下文已设置属性 preemptiveAuthentication="true" 时,此方法才有效。不会覆盖已存在的 authentication 标头。实际上,即使应用程序未配置安全约束,此方法也会触发身份验证,而不是拒绝。

这可以与 addConnectorPort 结合使用,以根据用于访问应用程序的客户端和连接器触发身份验证。

usePeerAddress

使用连接对等地址,而不是客户端 IP 地址。如果在 Tomcat 前面使用反向代理与 AJP 协议或 HTTP 协议以及 RemoteIp(Valve|Filter) 结合使用,它们将有所不同。

示例 1

仅允许从本地主机连接的客户端访问

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
   allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"/>

示例 2

允许从本地主机连接的客户端不受限制地访问,但允许所有其他客户端仅访问端口 8443

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
   addConnectorPort="true"
   allow="127\.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*|.*;8443"/>

示例 3

允许不受限制地访问端口 8009,但如果在其他端口访问应用程序,则触发基本身份验证

<Context>
  ...
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         addConnectorPort="true"
         invalidAuthenticationWhenDeny="true"
         allow=".*;8009"/>
  <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
  ...
</Context>

远程主机阀门

简介

远程主机阀允许您将提交此请求的客户端的主机名与一个或多个正则表达式进行比较,并允许请求继续或拒绝处理此客户端的请求。远程主机阀可以与任何 Catalina 容器(引擎主机上下文)关联,并且必须接受提交给此容器以进行处理的任何请求,然后才能将其传递。

正则表达式的语法与“标准”通配符匹配的语法不同。Tomcat 使用 java.util.regex 包。有关支持的表达式的详细信息,请查阅 Java 文档。

将属性 addConnectorPort 设置为 true 后,可以附加以分号 (";") 分隔的服务器连接器端口,以允许为每个连接器使用不同的表达式。

拒绝的请求将收到状态代码为 403 的响应。可以使用属性 denyStatus 覆盖此状态代码。

通过将属性 invalidAuthenticationWhenDeny 设置为 true,可以将拒绝请求时的行为更改为不拒绝,而是设置无效的 authentication 标头。这与上下文属性 preemptiveAuthentication="true" 结合使用时很有用。

注意:此阀处理方法 ServletRequest.getRemoteHost() 返回的值。要允许该方法返回正确的主机名,您必须在连接器上启用“DNS 查找”功能。

另请参阅:远程地址阀远程 CIDR 阀远程 IP 阀HTTP 连接器配置。

属性

远程主机阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.RemoteHostValve

allow

一个正则表达式(使用 java.util.regex),用于与远程客户端的主机名进行比较。如果指定此属性,则远程主机名必须匹配才能接受此请求。如果未指定此属性,则将接受所有请求,除非远程主机名与 deny 模式匹配。

deny

一个正则表达式(使用 java.util.regex),用于与远程客户端的主机名进行比较。如果指定此属性,则远程主机名必须不匹配才能接受此请求。如果未指定此属性,则请求接受仅受 allow 属性控制。

denyStatus

拒绝拒绝的请求时使用的 HTTP 响应状态代码。默认值为 403。例如,可以将其设置为值 404

addConnectorPort

将服务器连接器端口附加到客户端主机名,以分号 (";") 分隔。如果将其设置为 true,则使用 allowdeny 配置的表达式将与 HOSTNAME;PORT 进行比较,其中 HOSTNAME 是客户端主机名,PORT 是接收请求的 Tomcat 连接器端口。默认值为 false

invalidAuthenticationWhenDeny

当请求应该被拒绝时,不要拒绝,而是设置一个无效的 authentication 标头。仅当上下文已设置属性 preemptiveAuthentication="true" 时,此方法才有效。不会覆盖已存在的 authentication 标头。实际上,即使应用程序未配置安全约束,此方法也会触发身份验证,而不是拒绝。

这可以与 addConnectorPort 结合使用,以根据用于访问应用程序的客户端和连接器触发身份验证。

远程 CIDR 阀门

简介

远程 CIDR 阀门允许您将提交此请求的客户端的 IP 地址与一个或多个遵循 CIDR 表示法的网络掩码进行比较,并允许请求继续或拒绝处理此客户端的请求。IPv4 和 IPv6 均得到完全支持。远程 CIDR 阀门可以与任何 Catalina 容器(引擎主机上下文)相关联,并且必须接受提交给此容器以进行处理的任何请求,然后才能将其传递。

此阀门模拟 Apache 的 OrderAllow fromDeny from 指令,具有以下限制

  • Order 将始终为 allow, deny
  • 不支持网络掩码的点分四进制表示法(即,您不能编写 192.168.1.0/255.255.255.0,您必须编写 192.168.1.0/24
  • 不支持快捷方式,如 10.10.,它等效于 10.10.0.0/16
  • 正如阀门名称所述,这是一个仅限 CIDR 的阀门,因此也不支持子域表示法,如 .mydomain.com

将属性 addConnectorPort 设置为 true 后,可以附加以分号 (";") 分隔的服务器连接器端口,以允许为每个连接器使用不同的表达式。

通过将属性 usePeerAddress 设置为 true,阀门将在其检查中使用连接对等地址。如果在 Tomcat 前面使用反向代理与 AJP 协议或 HTTP 协议以及 RemoteIp(Valve|Filter) 结合使用,这将与客户端 IP 不同。

拒绝的请求将收到状态代码为 403 的响应。可以使用属性 denyStatus 覆盖此状态代码。

通过将属性 invalidAuthenticationWhenDeny 设置为 true,可以将拒绝请求时的行为更改为不拒绝,而是设置无效的 authentication 标头。这与上下文属性 preemptiveAuthentication="true" 结合使用时很有用。

此阀门的其他一些功能是

  • 如果您省略 CIDR 前缀,此阀门将变为单个 IP 阀门;
  • 远程主机阀门 不同,它可以处理缩写形式的 IPv6 地址(::1fe80::/71 等)。

另请参阅:远程地址阀门远程主机阀门远程 IP 阀门HTTP 连接器 配置。

属性

远程 CIDR 阀门支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.valves.RemoteCIDRValve

allow

远程客户端的 IP 地址与之匹配的 IPv4 或 IPv6 网络掩码或地址的逗号分隔列表。如果指定此属性,则远程地址必须匹配才能接受此请求。如果未指定此属性,则将接受所有请求,除非远程 IP 与 deny 属性中的网络掩码匹配。

deny

远程客户端的 IP 地址与之匹配的 IPv4 或 IPv6 网络掩码或地址的逗号分隔列表。如果指定此属性,则远程地址不得匹配才能接受此请求。如果未指定此属性,则请求接受仅受 accept 属性控制。

denyStatus

拒绝拒绝的请求时使用的 HTTP 响应状态代码。默认值为 403。例如,可以将其设置为值 404

addConnectorPort

将服务器连接器端口附加到客户端 IP 地址,并用分号 (";") 分隔。如果将其设置为 true,则使用 allowdeny 配置的表达式将与 ADDRESS;PORT 进行比较,其中 ADDRESS 是客户端 IP 地址,而 PORT 是接收请求的 Tomcat 连接器端口。默认值为 false

invalidAuthenticationWhenDeny

当请求应该被拒绝时,不要拒绝,而是设置一个无效的 authentication 标头。仅当上下文已设置属性 preemptiveAuthentication="true" 时,此方法才有效。不会覆盖已存在的 authentication 标头。实际上,即使应用程序未配置安全约束,此方法也会触发身份验证,而不是拒绝。

这可以与 addConnectorPort 结合使用,以根据用于访问应用程序的客户端和连接器触发身份验证。

usePeerAddress

使用连接对等地址,而不是客户端 IP 地址。如果在 Tomcat 前面使用反向代理与 AJP 协议或 HTTP 协议以及 RemoteIp(Valve|Filter) 结合使用,它们将有所不同。

示例 1

仅允许从本地主机连接的客户端访问

<Valve className="org.apache.catalina.valves.RemoteCIDRValve"
   allow="127.0.0.1, ::1"/>

示例 2

允许从本地网络连接的客户端不受限制地访问,但仅允许网络 10 中的所有客户端访问端口 8443

<Valve className="org.apache.catalina.valves.RemoteCIDRValve"
   addConnectorPort="true"
   allow="127.0.0.1;\d*|::1;\d*|10.0.0.0/8;8443"/>

示例 3

允许从网络 10 访问端口 8009,但如果在其他端口上访问应用程序,则触发基本身份验证

<Context>
  ...
  <Valve className="org.apache.catalina.valves.RemoteCIDRValve"
         addConnectorPort="true"
         invalidAuthenticationWhenDeny="true"
         allow="10.0.0.0/8;8009"/>
  <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
  ...
</Context>

代理支持

负载均衡器排空阀门

简介

使用 mod_jk 或 mod_proxy_ajp 时,客户端的会话 ID 用于确定哪个后端服务器将用于处理请求。如果目标节点正在“耗尽”(在 mod_jk 中,这是 DISABLED 状态;在 mod_proxy_ajp 中,这是 Drain (N) 状态),则过期会话的请求实际上会导致耗尽的节点无法耗尽。

遗憾的是,基于 AJP 的负载平衡器无法证明客户端提供的会话 ID 是否有效,因此会将针对该节点的任何会话请求发送到已禁用(或“耗尽”)的节点,导致“耗尽”进程比必要的时间更长。

此阀门检测对无效会话的请求,从请求中剥离会话信息,并重定向回同一 URL,负载平衡器应选择不同的(活动)节点来处理请求。这将加速已禁用节点的“耗尽”进程。

负载平衡器在请求中发送节点的激活状态,因此无需在已禁用的节点上进行状态更改。只需在阀门管道中配置此阀门,当激活状态设置为“已禁用”时,它将执行操作。

你应该注意在阀门管道中比任何身份验证阀门更早地注册此阀门,因为此阀门应该能够在任何身份验证阀门将请求保存到受保护的资源之前重定向请求。如果发生这种情况,将创建一个新会话,并且耗尽进程将停止,因为将建立一个新的有效会话。

属性

负载平衡器耗尽阀门支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名称。这必须设置为 org.apache.catalina.valves.LoadBalancerDrainingValve

redirectStatusCode

允许设置一个自定义重定向代码,当客户端被重定向到由负载均衡器重新平衡时使用。默认值为 307 TEMPORARY_REDIRECT。

ignoreCookieName

当与 ignoreCookieValue 一起使用时,客户端可以提供此 Cookie(及随附的值),这将导致此 Valve 不执行任何操作。这将允许你在重新启用之前探测你的已禁用节点,以确保它按预期工作。

ignoreCookieValue

当与 ignoreCookieName 一起使用时,客户端可以提供一个 Cookie(及随附的值),这将导致此 Valve 不执行任何操作。这将允许你在重新启用之前探测你的已禁用节点,以确保它按预期工作。

远程 IP 阀门

简介

Tomcat 端口为 mod_remoteip,此阀门使用代理或负载均衡器通过请求标头(例如“X-Forwarded-For”)提供的 IP 地址列表替换请求的明显客户端远程 IP 地址和主机名。

此阀门的另一个功能是使用代理或负载均衡器通过请求标头(例如“X-Forwarded-Proto”)提供的方案替换明显的方案(http/https)、服务器端口和 request.secure

此阀门可根据需要在 EngineHostContext 级别使用。通常,此阀门将在 Engine 级别使用。

如果与远程地址/主机阀门结合使用,则应首先定义此阀门,以确保将正确的客户端 IP 地址呈现给远程地址/主机阀门。

注意:默认情况下,此阀门对写入访问日志的值没有影响。当请求处理离开阀门时,原始值将被还原,并且这总是早于访问日志记录。要将此阀门设置的远程地址、远程主机、服务器端口和协议值传递到访问日志,它们将被放入请求属性中。默认情况下启用在此处发布这些值,但应明确配置 AccessLogValve 以使用它们。请参阅 AccessLogValverequestAttributesEnabled 属性的文档。

此阀门设置的请求属性的名称可供访问日志使用,如下所示

  • org.apache.catalina.AccessLog.RemoteAddr
  • org.apache.catalina.AccessLog.RemoteHost
  • org.apache.catalina.AccessLog.Protocol
  • org.apache.catalina.AccessLog.ServerPort
  • org.apache.tomcat.remoteAddr

属性

远程 IP 阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名称。此项必须设置为 org.apache.catalina.valves.RemoteIpValve

remoteIpHeader

此阀读取的 HTTP 标头名称,其中包含从请求客户端开始遍历的 IP 地址列表。如果未指定,则使用默认值 x-forwarded-for

internalProxies

正则表达式(使用 java.util.regex),代理的 IP 地址必须与之匹配才能被视为内部代理。出现在 remoteIpHeader 中的内部代理将被信任,并且不会出现在 proxiesHeader 值中。如果未指定,则使用默认值 10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|100\.6[4-9]{1}\.\d{1,3}\.\d{1,3}|100\.[7-9]{1}\d{1}\.\d{1,3}\.\d{1,3}|100\.1[0-1]{1}\d{1}\.\d{1,3}\.\d{1,3}|100\.12[0-7]{1}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}|0:0:0:0:0:0:0:1

proxiesHeader

此阀创建的 HTTP 标头名称,用于保存已在传入 remoteIpHeader 中处理的代理列表。如果未指定,则使用默认值 x-forwarded-by

requestAttributesEnabled

设置为 true 以设置 AccessLog 实现使用的请求属性,以覆盖请求返回的远程地址、远程主机、服务器端口和协议的值。请求属性还用于在 Manager Web 应用程序的状态页面上显示已转发的远程地址。如果未设置,则使用默认值 true

trustedProxies

正则表达式(使用 java.util.regex),代理的 IP 地址必须与之匹配才能被视为受信任代理。出现在 remoteIpHeader 中的受信任代理将被信任,并且会出现在 proxiesHeader 值中。如果未指定,则不会信任任何代理。

protocolHeader

此阀读取的 HTTP 标头名称,其中包含客户端用于连接到代理的协议。如果未指定,则使用默认值 X-Forwarded-Proto

hostHeader

此阀读取的 HTTP 标头名称,其中包含客户端用于连接到代理的主机。如果未指定,则使用默认值 null

portHeader

此阀读取的 HTTP 标头名称,其中包含客户端用于连接到代理的端口。如果未指定,则使用默认值 null

protocolHeaderHttpsValue

protocolHeader 的值,用于指示它是 HTTPS 请求。如果未指定,则使用默认值 https

httpServerPort

protocolHeader 指示 http 协议且没有 portHeader 时,ServletRequest.getServerPort() 返回的值。如果未指定,则使用默认值 80

httpsServerPort

protocolHeader 指示 https 协议且没有 portHeader 时,ServletRequest.getServerPort() 返回的值。如果未指定,则使用默认值 443

changeLocalName

如果为 true,则此阀门将修改 ServletRequest.getLocalHost()ServletRequest.getServerHost() 返回的值。如果未指定,则使用默认值 false

changeLocalPort

如果为 true,则此阀门将修改 ServletRequest.getLocalPort()ServletRequest.getServerPort() 返回的值。如果未指定,则使用默认值 false

SSL 阀门

简介

使用 mod_proxy_http 时,客户端 SSL 信息不包含在协议中(与 mod_jk 和 mod_proxy_ajp 不同)。为了使客户端 SSL 信息对 Tomcat 可用,需要一些额外的配置。在 httpd 中,mod_headers 用于将 SSL 信息添加为 HTTP 头。在 Tomcat 中,此阀门用于从 HTTP 头读取信息并将其插入请求中。

注意:确保 httpd 始终为所有请求设置头,以防止客户端通过发送伪造头来欺骗 SSL 信息。

要配置 httpd 以设置必要的头,请添加以下内容

<IfModule ssl_module>
  RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
  RequestHeader set SSL_CIPHER "%{SSL_CIPHER}s"
  RequestHeader set SSL_SESSION_ID "%{SSL_SESSION_ID}s"
  RequestHeader set SSL_CIPHER_USEKEYSIZE "%{SSL_CIPHER_USEKEYSIZE}s"
</IfModule>

属性

SSL 阀门支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.SSLValve

sslClientCertHeader

允许为 ssl_client_cert 头设置自定义名称。如果未指定,则使用默认值 ssl_client_cert

sslClientEscapedCertHeader

允许为 ssl_client_escaped_cert 头设置自定义名称。如果未指定,则使用默认值 ssl_client_escaped_cert

此头对 Nginx 代理很有用,并且优先于 ssl_client_cert 头。

sslCipherHeader

允许为 ssl_cipher 头设置自定义名称。如果未指定,则使用默认值 ssl_cipher

sslSessionIdHeader

允许为 ssl_session_id 头设置自定义名称。如果未指定,则使用默认值 ssl_session_id

sslCipherUserKeySizeHeader

允许为 ssl_cipher_usekeysize 标头设置自定义名称。如果未指定,则使用 ssl_cipher_usekeysize 的默认值。

单点登录阀门

简介

当您希望允许用户登录与您的虚拟主机关联的任何一个 Web 应用程序,然后让同一虚拟主机上的所有其他 Web 应用程序识别其身份时,将使用单点登录阀

有关更多信息,请参阅主机元素上的单点登录特殊功能。

属性

单点登录阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.authenticator.SingleSignOn

requireReauthentication

默认值为 false。用于确定是否需要对每个请求对安全领域进行重新身份验证的标志。如果为“true”,则此阀使用缓存的安全凭据(用户名和密码)对与 SSO 会话关联的每个请求重新对领域进行身份验证。如果为“false”,则阀本身可以根据有效 SSO cookie 的存在对请求进行身份验证,而无需重新向领域进行检查。

cookieDomain

设置要用于 sso cookie 的主机域。

cookieName

设置要用于 sso cookie 的 cookie 名称。默认值为 JSESSIONIDSSO

身份验证

本部分中的阀实现org.apache.catalina.Authenticator 接口。

基本身份验证器阀门

简介

基本身份验证器阀会自动添加到配置为使用 BASIC 身份验证的任何上下文中。

如果需要任何非默认设置,则可以在上下文元素中使用所需值配置阀。

属性

基本身份验证器阀支持以下配置属性

属性 说明
allowCorsPreflight

允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 neverfilteralwaysnever 表示请求绝不会绕过身份验证,即使它看似 CORS 预检请求。filter 表示如果请求看似 CORS 预检请求,则请求将绕过身份验证;它映射到启用了CORS 过滤器的 Web 应用程序;并且 CORS 过滤器映射到 /*always 表示所有看似 CORS 预检请求的请求都将绕过身份验证。如果未设置,则默认值为 never

alwaysUseSession

用户经过身份验证后是否始终使用会话?这可能会提供一些性能优势,因为会话可用于缓存经过身份验证的主体,因此无需在每次请求时通过领域对用户进行身份验证。这可能有助于使用 JNDIRealm 或 DataSourceRealms 的基本身份验证等组合。但是,创建和 GC 会话也会有性能成本。如果未设置,将使用默认值 false

cache

如果请求是 HTTP 会话的一部分,我们是否应该缓存经过身份验证的主体?如果未指定,将使用默认值 true

changeSessionIdOnAuthentication

控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 true

charset

控制 WWW-Authenticate HTTP 标头是否包含 charset 身份验证参数,如 RFC 7617 所述。唯一允许的选项是 null、空字符串和 UTF-8。如果指定 UTF-8,则 charset 身份验证参数将使用该值发送,并且提供的用户名和可选密码将使用 UTF-8 从字节转换为字符。否则,不会发送 charset 身份验证参数,并且提供的用户名和可选密码将使用 ISO-8859-1 从字节转换为字符。默认值为 null

className

要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.authenticator.BasicAuthenticator

disableProxyCaching

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,但也将导致安全页面被代理缓存,这几乎肯定会成为安全问题。securePagesWithPragma 为浏览器缓存问题提供了一种替代的安全解决方法。如果未设置,将使用默认值 true

jaspicCallbackHandlerClass

JASPIC 应使用的 javax.security.auth.callback.CallbackHandler 实现的 Java 类的名称。如果未指定,将使用默认的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

securePagesWithPragma

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,方法是使用 Cache-Control: private 而不是默认的 Pragma: No-cacheCache-control: No-cache。如果未设置,将使用默认值 false

secureRandomAlgorithm

用于创建生成会话 ID 的 java.security.SecureRandom 实例的算法名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用 SHA1PRNG 的默认算法。如果默认算法不受支持,将使用平台默认值。要指定应使用平台默认值,请不要设置 secureRandomProvider 属性,并将此属性设置为一个空字符串。

secureRandomClass

扩展 java.security.SecureRandom 以用于生成 SSO 会话 ID 的 Java 类的名称。如果未指定,默认值为 java.security.SecureRandom

secureRandomProvider

用于创建生成 SSO 会话 ID 的 java.security.SecureRandom 实例的提供程序的名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用平台默认提供程序。

sendAuthInfoResponseHeaders

控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 RemoteIpValveRemoteIpFilter 使用 Globals.REQUEST_FORWARDED_ATTRIBUTE 标记转发请求时,此身份验证器可以将 HttpServletRequest.getRemoteUser()HttpServletRequest.getAuthType() 的值作为响应头 remote-userauth-type 返回给反向代理。这很有用,例如,用于访问日志一致性或其他决策。如果未指定,则默认值为 false

trimCredentials

控制是否从解析的凭据中删除前导和/或尾随空格。如果未指定,则默认值为 false

注意:此属性将从 Tomcat 11 起删除。

摘要身份验证器阀门

简介

摘要身份验证器阀门会自动添加到配置为使用 DIGEST 身份验证的任何 上下文 中。

如果需要任何非默认设置,则可以在上下文元素中使用所需值配置阀。

属性

摘要身份验证器阀门支持以下配置属性

属性 说明
algorithms

用于身份验证过程的摘要算法的逗号分隔列表。可以使用 Java 标准名称或 RFC 7616 使用的名称指定算法。如果未指定,则将使用默认值 SHA-256,MD5

allowCorsPreflight

允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 neverfilteralwaysnever 表示请求绝不会绕过身份验证,即使它看似 CORS 预检请求。filter 表示如果请求看似 CORS 预检请求,则请求将绕过身份验证;它映射到启用了CORS 过滤器的 Web 应用程序;并且 CORS 过滤器映射到 /*always 表示所有看似 CORS 预检请求的请求都将绕过身份验证。如果未设置,则默认值为 never

alwaysUseSession

用户经过身份验证后是否始终使用会话?这可能会提供一些性能优势,因为会话可用于缓存经过身份验证的主体,因此无需在每次请求时通过领域对用户进行身份验证。这可能有助于使用 JNDIRealm 或 DataSourceRealms 的基本身份验证等组合。但是,创建和 GC 会话也会有性能成本。如果未设置,将使用默认值 false

cache

如果请求是 HTTP 会话的一部分,我们是否应缓存经过身份验证的主体?如果未指定,则将使用默认值 false

changeSessionIdOnAuthentication

控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 true

className

要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.authenticator.DigestAuthenticator

disableProxyCaching

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,但也将导致安全页面被代理缓存,这几乎肯定会成为安全问题。securePagesWithPragma 为浏览器缓存问题提供了一种替代的安全解决方法。如果未设置,将使用默认值 true

jaspicCallbackHandlerClass

JASPIC 应使用的 javax.security.auth.callback.CallbackHandler 实现的 Java 类的名称。如果未指定,将使用默认的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

key

摘要身份验证使用的密钥。如果未设置,则会生成一个安全随机值。通常只有在有必要在服务器重新启动和/或集群中保持密钥值不变时才应设置此值。

nonceCacheSize

为了防止重放攻击,DIGEST 身份验证器会跟踪服务器随机数和随机数计数值。此属性控制该缓存的大小。如果未指定,则使用默认值 1000。

nonceCountWindowSize

客户端请求可能会乱序处理,这意味着随机数计数值也可能会乱序处理。为了防止在随机数计数乱序呈现时出现身份验证失败,身份验证器会跟踪随机数计数值的窗口。此属性控制该窗口的大小。如果未指定,则使用默认值 100。

nonceValidity

服务器生成的随机数在身份验证中被视为有效的毫秒数。如果未指定,则将使用默认值 300000(5 分钟)。

不透明

摘要验证使用的服务器不透明字符串。如果没有设置,将生成一个随机值。通常只在需要在服务器重启和/或群集之间保持不透明值不变时才设置此值。

securePagesWithPragma

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,方法是使用 Cache-Control: private 而不是默认的 Pragma: No-cacheCache-control: No-cache。如果未设置,将使用默认值 false

secureRandomAlgorithm

用于创建生成会话 ID 的 java.security.SecureRandom 实例的算法名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用 SHA1PRNG 的默认算法。如果默认算法不受支持,将使用平台默认值。要指定应使用平台默认值,请不要设置 secureRandomProvider 属性,并将此属性设置为一个空字符串。

secureRandomClass

扩展 java.security.SecureRandom 以用于生成 SSO 会话 ID 的 Java 类的名称。如果未指定,默认值为 java.security.SecureRandom

secureRandomProvider

用于创建生成 SSO 会话 ID 的 java.security.SecureRandom 实例的提供程序的名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用平台默认提供程序。

sendAuthInfoResponseHeaders

控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 RemoteIpValveRemoteIpFilter 使用 Globals.REQUEST_FORWARDED_ATTRIBUTE 标记转发请求时,此身份验证器可以将 HttpServletRequest.getRemoteUser()HttpServletRequest.getAuthType() 的值作为响应头 remote-userauth-type 返回给反向代理。这很有用,例如,用于访问日志一致性或其他决策。如果未指定,则默认值为 false

validateUri

是否应根据 RFC2617 验证 URI?如果没有指定,将使用默认值 true。通常只在 Tomcat 位于反向代理后面并且代理修改传递给 Tomcat 的 URI 时才设置此值,以使 DIGEST 验证始终失败。

表单身份验证器阀门

简介

表单验证器阀门会自动添加到配置为使用 FORM 验证的任何 Context 中。

如果需要任何非默认设置,则可以在上下文元素中使用所需值配置阀。

属性

表单验证器阀门支持以下配置属性

属性 说明
allowCorsPreflight

允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 neverfilteralwaysnever 表示请求绝不会绕过身份验证,即使它看似 CORS 预检请求。filter 表示如果请求看似 CORS 预检请求,则请求将绕过身份验证;它映射到启用了CORS 过滤器的 Web 应用程序;并且 CORS 过滤器映射到 /*always 表示所有看似 CORS 预检请求的请求都将绕过身份验证。如果未设置,则默认值为 never

authenticationSessionTimeout

如果验证过程创建会话,这是验证过程中的最大会话超时时间(以秒为单位)。一旦验证完成,将应用默认会话超时时间。在验证过程开始之前存在的会话将始终保留其原始会话超时时间。如果没有设置,将使用默认值 120 秒。

changeSessionIdOnAuthentication

控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 true

characterEncoding

用于从请求中读取用户名和密码参数的字符编码。如果没有设置,将使用请求正文的编码。

className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.authenticator.FormAuthenticator

disableProxyCaching

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,但也将导致安全页面被代理缓存,这几乎肯定会成为安全问题。securePagesWithPragma 为浏览器缓存问题提供了一种替代的安全解决方法。如果未设置,将使用默认值 true

jaspicCallbackHandlerClass

JASPIC 应使用的 javax.security.auth.callback.CallbackHandler 实现的 Java 类的名称。如果未指定,将使用默认的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

landingPage

如果 FORM 验证过程被误用(例如直接请求登录页面或延迟登录时间过长以致会话过期),则控制 FORM 验证过程的行为。如果设置此属性,Tomcat 不会返回错误响应代码,而是在使用有效凭据提交登录表单时将用户重定向到指定的登录页面。要处理登录,登录页面必须是受保护的资源(即需要验证的资源)。如果登录页面不需要验证,则用户将不会登录,并且在访问受保护页面时会再次提示他们输入凭据。

securePagesWithPragma

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,方法是使用 Cache-Control: private 而不是默认的 Pragma: No-cacheCache-control: No-cache。如果未设置,将使用默认值 false

secureRandomAlgorithm

用于创建生成会话 ID 的 java.security.SecureRandom 实例的算法名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用 SHA1PRNG 的默认算法。如果默认算法不受支持,将使用平台默认值。要指定应使用平台默认值,请不要设置 secureRandomProvider 属性,并将此属性设置为一个空字符串。

secureRandomClass

扩展 java.security.SecureRandom 以用于生成 SSO 会话 ID 的 Java 类的名称。如果未指定,默认值为 java.security.SecureRandom

secureRandomProvider

用于创建生成 SSO 会话 ID 的 java.security.SecureRandom 实例的提供程序的名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用平台默认提供程序。

sendAuthInfoResponseHeaders

控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 RemoteIpValveRemoteIpFilter 使用 Globals.REQUEST_FORWARDED_ATTRIBUTE 标记转发请求时,此身份验证器可以将 HttpServletRequest.getRemoteUser()HttpServletRequest.getAuthType() 的值作为响应头 remote-userauth-type 返回给反向代理。这很有用,例如,用于访问日志一致性或其他决策。如果未指定,则默认值为 false

SSL 身份验证器阀门

简介

SSL 验证器阀门会自动添加到配置为使用 SSL 验证的任何 Context 中。

如果需要任何非默认设置,则可以在上下文元素中使用所需值配置阀。

属性

SSL 验证器阀门支持以下配置属性

属性 说明
allowCorsPreflight

允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 neverfilteralwaysnever 表示请求绝不会绕过身份验证,即使它看似 CORS 预检请求。filter 表示如果请求看似 CORS 预检请求,则请求将绕过身份验证;它映射到启用了CORS 过滤器的 Web 应用程序;并且 CORS 过滤器映射到 /*always 表示所有看似 CORS 预检请求的请求都将绕过身份验证。如果未设置,则默认值为 never

cache

如果请求是 HTTP 会话的一部分,我们是否应该缓存经过身份验证的主体?如果未指定,将使用默认值 true

className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.authenticator.SSLAuthenticator

changeSessionIdOnAuthentication

控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 true

disableProxyCaching

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,但也将导致安全页面被代理缓存,这几乎肯定会成为安全问题。securePagesWithPragma 为浏览器缓存问题提供了一种替代的安全解决方法。如果未设置,将使用默认值 true

jaspicCallbackHandlerClass

JASPIC 应使用的 javax.security.auth.callback.CallbackHandler 实现的 Java 类的名称。如果未指定,将使用默认的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

securePagesWithPragma

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,方法是使用 Cache-Control: private 而不是默认的 Pragma: No-cacheCache-control: No-cache。如果未设置,将使用默认值 false

secureRandomAlgorithm

用于创建生成会话 ID 的 java.security.SecureRandom 实例的算法名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用 SHA1PRNG 的默认算法。如果默认算法不受支持,将使用平台默认值。要指定应使用平台默认值,请不要设置 secureRandomProvider 属性,并将此属性设置为一个空字符串。

secureRandomClass

扩展 java.security.SecureRandom 以用于生成 SSO 会话 ID 的 Java 类的名称。如果未指定,默认值为 java.security.SecureRandom

secureRandomProvider

用于创建生成 SSO 会话 ID 的 java.security.SecureRandom 实例的提供程序的名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用平台默认提供程序。

SPNEGO 阀门

简介

SPNEGO 认证阀会自动添加到配置为使用 SPNEGO 认证的任何 上下文 中。

如果需要任何非默认设置,则可以在上下文元素中使用所需值配置阀。

属性

SPNEGO 认证阀支持以下配置属性

属性 说明
allowCorsPreflight

是否允许看起来像是 CORS 预检请求的请求绕过认证器,这是 CORS 规范的要求。允许的值为 neverfilteralwaysnever 表示即使请求看起来像是 CORS 预检请求,也不会绕过认证。filter 表示如果请求看起来像是 CORS 预检请求,并且请求映射到的 Web 应用程序启用了 CORS 过滤器 并将其映射到 /*,则请求将绕过认证。always 表示所有看起来像是 CORS 预检请求的请求都将绕过认证。如果未设置,则默认值为 never

alwaysUseSession

用户经过认证后是否应始终使用会话?这可能会带来一些性能优势,因为随后可以使用会话来缓存经过认证的主体,从而无需在每个请求上对用户进行认证。这还有助于假定服务器将缓存经过认证用户的客户端。但是,创建和 GC 会话也会产生性能成本。有关备选解决方案,请参阅 noKeepAliveUserAgents。如果未设置,将使用 false 的默认值。

applyJava8u40Fix

Java 8 更新 40 (JDK-8048194) 中引入的一个修复程序中断了在 Windows 2008 R2 服务器上运行的 Tomcat 的 IE SPNEGO 认证。此选项启用了一个解决方法,使 SPNEGO 认证能够继续工作。该解决方法不应影响其他配置,因此默认情况下已启用。如有必要,可以通过将此属性设置为 false 来禁用该解决方法。

cache

如果请求是 HTTP 会话的一部分,我们是否应该缓存经过身份验证的主体?如果未指定,将使用默认值 true

className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.authenticator.SpnegoAuthenticator

changeSessionIdOnAuthentication

控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 true

disableProxyCaching

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,但也将导致安全页面被代理缓存,这几乎肯定会成为安全问题。securePagesWithPragma 为浏览器缓存问题提供了一种替代的安全解决方法。如果未设置,将使用默认值 true

jaspicCallbackHandlerClass

JASPIC 应使用的 javax.security.auth.callback.CallbackHandler 实现的 Java 类的名称。如果未指定,将使用默认的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

loginConfigName

用作服务的登录的 JAAS 登录配置的名称。如果未指定,则使用默认值 com.sun.security.jgss.krb5.accept

noKeepAliveUserAgents

某些客户端(不是大多数浏览器)希望服务器为连接缓存经过认证的用户信息,并且不会在每次请求中重新发送凭据。除非有 HTTP 会话可用,否则 Tomcat 不会这样做。如果应用程序创建会话或为此认证器启用了 alwaysUseSession,则将有会话可用。

作为创建会话的备选方案,此属性可用于定义禁用 HTTP 保持活动状态的用户代理。这意味着连接将仅用于单个请求,因此无法按连接缓存经过认证的用户信息。禁用 HTTP 保持活动状态将产生性能成本。

该属性应为匹配整个用户代理字符串的正则表达式,例如 .*Chrome.*。如果未指定,则不会定义正则表达式,并且不会禁用任何用户代理的 HTTP 保持活动。

securePagesWithPragma

控制受安全约束保护的页面的缓存。将其设置为 false 可能有助于解决某些浏览器中的缓存问题,方法是使用 Cache-Control: private 而不是默认的 Pragma: No-cacheCache-control: No-cache。如果未设置,将使用默认值 false

secureRandomAlgorithm

用于创建生成会话 ID 的 java.security.SecureRandom 实例的算法名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用 SHA1PRNG 的默认算法。如果默认算法不受支持,将使用平台默认值。要指定应使用平台默认值,请不要设置 secureRandomProvider 属性,并将此属性设置为一个空字符串。

secureRandomClass

扩展 java.security.SecureRandom 以用于生成 SSO 会话 ID 的 Java 类的名称。如果未指定,默认值为 java.security.SecureRandom

secureRandomProvider

用于创建生成 SSO 会话 ID 的 java.security.SecureRandom 实例的提供程序的名称。如果指定了无效的算法和/或提供程序,将使用平台默认提供程序和默认算法。如果未指定,将使用平台默认提供程序。

sendAuthInfoResponseHeaders

控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 RemoteIpValveRemoteIpFilter 使用 Globals.REQUEST_FORWARDED_ATTRIBUTE 标记转发请求时,此身份验证器可以将 HttpServletRequest.getRemoteUser()HttpServletRequest.getAuthType() 的值作为响应头 remote-userauth-type 返回给反向代理。这很有用,例如,用于访问日志一致性或其他决策。如果未指定,则默认值为 false

storeDelegatedCredential

控制是否将用户的委派凭证存储在用户主体中。如果可用,则应用程序可以通过 org.apache.catalina.realm.GSS_CREDENTIAL 请求属性使用委派凭证(例如,用于对外部服务进行后续身份验证)。如果未设置,则将使用默认值 true

错误报告阀门

简介

错误报告阀是针对 HTTP 状态代码的简单错误处理程序,它将生成并返回 HTML 错误页面。它还可以配置为针对特定状态代码和/或异常类型返回预定义的静态 HTML 页面。

注意:同时禁用 showServerInfo 和 showReport 将仅返回 HTTP 状态代码。

属性

错误报告阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。必须将其设置为 org.apache.catalina.valves.ErrorReportValve 才能使用默认错误报告阀。

errorCode.nnn

用于返回 nnn 表示的 HTTP 错误代码的 UTF-8 编码 HTML 文件的位置。例如,errorCode.404 指定了针对 HTTP 404 错误返回的文件。位置可以是相对的或绝对的。如果为相对位置,则必须相对于 $CATALINA_BASE。特殊值 errorCode.0 可用于定义默认错误页面,如果未为状态代码定义错误页面,则使用该页面。如果未找到匹配的错误页面,则将返回默认的 错误报告阀响应。

exceptionType.fullyQualifiedClassName

如果发生错误并且 jakarta.servlet.error.exception 请求属性已设置为 fullyQualifiedClassName 或其子类的实例,则返回 UTF-8 编码 HTML 文件的位置。例如,errorCode.java.io.IOException 指定了针对 IOException 返回的文件。位置可以是相对的或绝对的。如果为相对位置,则必须相对于 $CATALINA_BASE。如果未找到匹配的错误页面,则将返回默认的 错误报告阀响应。

showReport

当发生错误时,确定是否显示错误报告(自定义错误消息和/或堆栈跟踪)的标志。如果设置为 false,则不会在 HTML 响应中返回错误报告。默认值:true

showServerInfo

当发生错误时确定是否显示服务器信息的标志。如果设置为 false,则 HTML 响应中不会返回服务器版本。默认值:true

Json 错误报告阀门

简介

Json 错误报告阀是 HTTP 状态代码的简单错误处理程序,它将返回 Json 错误消息。

通过在 Host 中的 errorReportValveClass 属性中指定此类,它将被用作 ErrorReportValve 的替代,并将返回 JSON 响应而不是 HTML。

属性

Json 错误报告阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.JsonErrorReportValve

代理错误报告阀门

简介

代理错误报告阀是 HTTP 状态代码的简单错误处理程序,它将重定向或代理到负责生成错误报告的另一个位置。

通过在 Host 中的 errorReportValveClass 属性中指定此类,它将被用作具有默认属性值的 ErrorReportValve 的替代。要配置属性,可以在 Host 元素中嵌套定义阀。

属性

代理错误报告阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.ProxyErrorReportValve

usePropertiesFile

如果为 true,阀将使用下面描述的属性文件将 URL 与状态代码关联起来。如果为 false,则将改用默认 ErrorReportValve 的配置机制。默认值为 false

useRedirect

如果为 true,阀将向 URL 发送重定向。如果为 false,阀将改用从指定 URL 代理内容。默认值为 true

配置

代理错误报告阀可以使用类路径中的资源文件 ProxyErrorReportValve.properties,其中每个条目都是 statusCode=baseUrl。baseUrl 不应包含任何 url 参数、statusCode、statusDescription、requestUri 和 throwable,这些将自动附加。应使用名为 0 的特殊键将任何其他未映射的代码与重定向或代理 URL 匹配。

爬虫会话管理器阀门

简介

网络爬虫在抓取网站时可能会触发创建数千个会话,这可能会导致大量的内存消耗。此阀确保爬虫与单个会话关联起来,就像普通用户一样,无论他们是否在其请求中提供了会话令牌。

此阀门可根据需要在 EngineHostContext 级别使用。通常,此阀门将在 Engine 级别使用。

如果与远程 IP 阀一起使用,则应在此阀之前定义远程 IP 阀,以确保向此阀提供正确的客户端 IP 地址。

属性

爬虫会话管理器阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.CrawlerSessionManagerValve

contextAware

标志,用于将上下文名称与客户端 IP 一起使用来识别要重新使用的会话。可以与 hostAware 结合使用。默认值:true

crawlerIps

正则表达式(使用 java.util.regex),客户端 IP 与之匹配以确定请求是否来自网络爬虫。默认情况下,未设置此类正则表达式。

crawlerUserAgents

正则表达式(使用 java.util.regex),用户代理 HTTP 请求头与之匹配以确定请求是否来自网络爬虫。如果未设置,则使用默认值 .*[bB]ot.*|.*Yahoo! Slurp.*|.*Feedfetcher-Google.*

hostAware

标志,用于将配置的主机与客户端 IP 一起使用以识别要重新使用的会话。可以与 contextAware 结合使用。默认值:true

sessionInactiveInterval

Crawler Session Manager Valve 应在内存中将客户端 IP 映射到会话 ID 的最短时间(以秒为单位),且客户端没有任何活动。客户端 IP/会话缓存将定期清除已处于非活动状态超过此时间间隔的映射。如果未指定,则使用默认值 60

卡住的线程检测阀门

简介

此阀允许检测处理时间过长的请求,这可能表明正在处理它的线程已卡住。此外,它还可以选择中断此类线程以尝试解除其阻塞。

当检测到此类请求时,其线程的当前堆栈跟踪将以 WARN 级别写入 Tomcat 日志。

可以通过 JMX 在 stuckThreadIdsstuckThreadNames 属性中获取卡住线程的 ID 和名称。ID 可与标准线程 JVM MBean(java.lang:type=Threading)一起使用,以检索有关每个卡住线程的其他信息。

属性

卡住线程检测阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.StuckThreadDetectionValve

threshold

以秒为单位的最小持续时间,在此之后线程被视为卡住。默认值为 600 秒。如果设置为 0,则禁用检测。

注意:由于检测(和可选的中断)是在声明此阀门的容器(引擎、主机或上下文)的后台线程中完成的,因此阈值应高于此容器的 backgroundProcessorDelay

interruptThreadThreshold

卡住的线程在尝试“释放”它之前被中断的最小持续时间(以秒为单位)。

请注意,无法保证线程会解除卡住状态。这通常适用于卡在 I/O 或锁上的线程,但对于无限循环可能无用。

默认值为 -1,禁用此功能。要启用它,该值必须大于或等于 threshold

信号量阀门

简介

Semaphore Valve 能够限制并发请求处理线程的数量。

org.apache.catalina.valves.SemaphoreValve 提供可由子类覆盖以自定义行为的方法

  • 可以覆盖 controlConcurrency 以添加条件;
  • 当许可未被授予时,可以覆盖 permitDenied 以添加错误处理。

属性

Semaphore Valve 支持以下配置属性

属性 说明
block

确定是否在许可可用之前阻塞线程的标志。默认值为 true

className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.SemaphoreValve

concurrency

信号量的并发级别。默认值为 10

fairness

信号量的公平性。默认值为 false

highConcurrencyStatus

如果无法从信号量获取许可,则将返回给客户端的错误状态代码(如果值为正)。默认值为 -1,这意味着不会发回错误状态。

interruptible

确定是否可以在许可可用之前中断线程的标志。默认值为 false

健康检查阀门

简介

Health Check Valve 响应云编排器的健康检查。

属性

Health Check Valve 支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.HealthCheckValve

path

云编排器健康检查逻辑的路径。如果阀门与上下文关联,则此路径将相对于上下文路径。否则,阀门将匹配完整的 URI。默认值为 /health

checkContainersAvailable

如果为 true,则阀门将检查其关联的容器及其所有子容器是否可用。默认值为 true

持久性阀门

简介

实现按请求会话持久性的 PersistentValve。它旨在与非粘性负载均衡器一起使用。

属性

PersistentValve 阀支持以下配置属性

属性 说明
className

要使用的实现的 Java 类名称。此项必须设置为 org.apache.catalina.valves.PersistentValve

filter

对于已知的文件扩展名或 URL,可以使用此过滤器模式通知阀,此请求期间不需要会话。如果请求与此过滤器模式匹配,则阀会假定没有必要恢复会话。示例过滤器可能如下所示: filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"。过滤器是使用 java.util.regex 的正则表达式。

semaphoreAcquireUninterruptibly

标志,用于确定等待每个会话的信号量时阻塞的线程是否应不间断地执行此操作。如果 semaphoreBlockOnAcquirefalse,则此标志无效。如果未指定,则将使用默认值 true

semaphoreBlockOnAcquire

标志,用于确定当另一个线程持有每个会话的信号量时希望获取该信号量的线程是否应阻塞,直到它可以获取信号量,或者是否应拒绝等待请求。如果未指定,则将使用默认值 true

semaphoreFairness

标志,用于确定每个会话的信号量是否将按照接收信号量请求的顺序授予请求。如果 semaphoreBlockOnAcquirefalse,则此标志无效。如果未指定,则将使用默认值 true