Valve 组件

目录

简介

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

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

访问日志

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

访问日志 Valve

简介

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

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

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

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

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

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

属性

Access Log Valve 支持以下配置属性

属性描述
buffered

标志,用于确定是否缓冲日志记录。如果设置为 false,则每次请求后都会写入访问日志。默认值:true

className

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

condition

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

conditionIf

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

conditionUnless

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

directory

此 valve 创建的日志文件将放置的目录的绝对或相对路径名。如果指定相对路径,则将其解释为相对于 $CATALINA_BASE。如果未指定 directory 属性,则默认值为 "logs"(相对于 $CATALINA_BASE)。

encoding

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

fileDateFormat

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

ipv6Canonical

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

locale

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

maxDays

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

maxLogMessageBufferSize

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

pattern

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

prefix

添加到每个日志文件名开头的字符前缀。如果未指定,默认值为 "access_log"。

renameOnRotate

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

requestAttributesEnabled

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

resolveHosts

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

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

rotatable

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

suffix

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

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}L 写入与请求关联的标识符,其中 xxx 的唯一有效值为 c(用于连接)。
  • %{xxx}T 写入处理请求所用的时间,单位为 xxx,其中有效单位为 ns(纳秒)、us(微秒)、ms(毫秒)、fracsec(小数秒)或 s(整秒)。%{s}T 等同于 %T%{us}T 等同于 %D

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

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

这些格式不能在同一格式令牌中与 SimpleDateFormat 格式混合使用。

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

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

通过向模式添加多个 %{xxx}t 令牌,还可以同时记录两个时间戳。

转义规则如下

  • " 转义为 \"
  • \ 转义为 \\
  • 对于 \f\n\r\t 使用标准 C 转义
  • 任何其他控制字符或码点高于 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 的反向代理,请参阅通用代理文档。对于其他反向代理,请查阅其文档。

扩展访问日志 Valve

简介

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

属性

Extended Access Log Valve 支持标准 Access Log Valve 的所有配置属性。只有 classNamepattern 的值不同。

属性描述
className

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

pattern

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

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

支持以下格式令牌

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

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

  • x-H(authType): getAuthType
  • x-H(characterEncoding): getCharacterEncoding
  • x-H(connectionId): getServletConnection().getConnectionId
  • 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 访问日志 Valve

简介

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

属性

JSON Access Log Valve 支持标准 Access Log Valve 的所有配置属性。只有 className 的值不同。

属性描述
className

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

虽然支持的模式与常规 Access Log Valve 相同,但存在一些差异

  • 请求以 JSON 对象的形式记录。
  • 每个支持的 "%X" 单字符模式标识符在此对象中生成一个键值对。请参阅下文以获取相应模式标识符使用的键列表。
  • 每个使用 %{xxx}X 形式的子键的模式标识符,其中 "X" 是 "a"、"p" 或 "t" 之一,将生成一个 "key-xxx" 形式的键值对。请参阅下文以获取相应模式标识符使用的键列表。
  • 每个使用 %{xxx}X 形式的子键的模式标识符,其中 "X" 是 "c"、"i"、"o"、"r" 或 "s" 之一,将生成一个子对象。请参阅下文以获取指向此子对象的键。子对象中的键是模式中的 "xxx" 子键。
  • 每个不支持的 "%X" 字符模式标识符将生成一个使用键 "other-X" 的键值对。
  • 记录的值与标准 Access Log Valve 为相同模式标识符记录的值相同。
  • 所有 "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

访问控制

远程地址 Valve

简介

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

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

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

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

拒绝的请求将以状态码 403 进行响应。此状态码可以使用属性 denyStatus 覆盖。

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

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

另请参阅:远程主机 Valve远程 CIDR Valve远程 IP ValveHTTP 连接器配置。

属性

Remote Address Valve 支持以下配置属性

属性描述
className

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

allow

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

deny

一个正则表达式(使用 java.util.regex),远程客户端的 IP 地址将与其进行比较。如果指定此属性,则远程地址不得匹配才能接受此请求。如果未指定此属性,则请求的接受仅由 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

只允许从 localhost 连接的客户端访问

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

示例 2

允许从 localhost 连接的客户端无限制访问,但所有其他客户端只能访问端口 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>

远程主机 Valve

简介

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

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

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

拒绝的请求将以状态码 403 进行响应。此状态码可以使用属性 denyStatus 覆盖。

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

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

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

属性

Remote Host Valve 支持以下配置属性

属性描述
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 Valve

简介

Remote CIDR Valve 允许您将提交此请求的客户端的 IP 地址与一个或多个遵循 CIDR 表示法的网络掩码进行比较,并允许请求继续或拒绝处理来自此客户端的请求。IPv4 和 IPv6 都完全支持。Remote CIDR Valve 可以与任何 Catalina 容器(EngineHostContext)关联,并且必须接受提交给此容器进行处理的任何请求,然后才能将其传递。

此 valve 模仿 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
  • 正如 valve 名称所示,这是一个仅限 CIDR 的 valve,因此也不支持 .mydomain.com 之类的子域表示法。

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

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

拒绝的请求将以状态码 403 进行响应。此状态码可以使用属性 denyStatus 覆盖。

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

此 valve 的其他一些功能是

  • 如果您省略 CIDR 前缀,此 valve 将成为单个 IP valve;
  • Remote Host Valve 不同,它可以处理压缩形式的 IPv6 地址(::1fe80::/71 等)。

另请参阅:远程地址 Valve远程主机 Valve远程 IP ValveHTTP 连接器配置。

属性

Remote CIDR Valve 支持以下配置属性

属性描述
className

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

allow

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

deny

一个逗号分隔的 IPv4 或 IPv6 网络掩码或地址列表,远程客户端的 IP 地址将与其进行匹配。如果指定此属性,则远程地址不得匹配才能接受此请求。如果未指定此属性,则请求的接受仅由 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

只允许从 localhost 连接的客户端访问

<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>

代理支持

负载均衡器排水 Valve

简介

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

不幸的是,基于 AJP 的负载均衡器无法证明客户端提供的会话 ID 是否有效,因此会将会话(似乎指向该节点)的所有请求发送到禁用的(或“排水”)节点,导致“排水”过程比必要的时间更长。

此 Valve 检测无效会话的请求,从请求中剥离会话信息,并重定向回同一 URL,在此处负载均衡器应选择不同的(活动)节点来处理请求。这将加速禁用节点的“排水”过程。

节点的激活状态由负载均衡器在请求中发送,因此无需在被禁用的节点上进行状态更改。只需在 Valve 管道中配置此 Valve,当激活状态设置为“disabled”时,它将采取行动。

您应该注意将此 Valve 在认证 Valve 之前注册到 Valve 管道中,因为此 Valve 应该能够在任何认证 Valve 保存受保护资源的请求之前重定向请求。如果发生这种情况,将创建一个新会话,并且排水过程将停滞,因为将建立一个有效的新会话。

属性

Load Balancer Draining Valve 支持以下配置属性

属性描述
className

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

redirectStatusCode

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

ignoreCookieName

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

ignoreCookieValue

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

远程 IP Valve

简介

mod_remoteip 的 Tomcat 端口,此 valve 将请求的表观客户端远程 IP 地址和主机名替换为代理或负载均衡器通过请求头(例如 "X-Forwarded-For")提供的 IP 地址列表。

此 valve 的另一个功能是替换表观方案 (http/https)、服务器端口和 request.secure 为代理或负载均衡器通过请求头(例如 "X-Forwarded-Proto")提供的方案。

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

如果与 Remote Address/Host valve 结合使用,则应首先定义此 valve,以确保将正确的客户端 IP 地址呈现给 Remote Address/Host valve。

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

此 valve 设置的、可用于访问日志记录的请求属性名称如下

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

属性

Remote IP Valve 支持以下配置属性

属性描述
className

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

remoteIpHeader

此 valve 读取的 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|::1|fe[89ab]\p{XDigit}:.*|"f[cd]\p{XDigit}{2}+:.*

proxiesHeader

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

requestAttributesEnabled

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

trustedProxies

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

protocolHeader

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

hostHeader

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

portHeader

此 valve 读取的 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() 返回的值将由此 valve 修改。如果未指定,则使用默认值 false

changeLocalPort

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

SSL Valve

简介

当使用 mod_proxy_http 时,客户端 SSL 信息不包含在协议中(与 mod_jk 和 mod_proxy_ajp 不同)。为了使客户端 SSL 信息可供 Tomcat 使用,需要进行一些额外配置。在 httpd 中,mod_headers 用于将 SSL 信息添加为 HTTP 标头。在 Tomcat 中,此 valve 用于从 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 Valve 支持以下配置属性

属性描述
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

单点登录 Valve

简介

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

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

属性

Single Sign On Valve 支持以下配置属性

属性描述
className

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

requireReauthentication

默认为 false。标志,用于确定每个请求是否需要重新认证到安全 Realm。如果为 "true",此 Valve 使用缓存的安全凭据(用户名和密码)重新认证与 SSO 会话关联的每个请求到 Realm。如果为 "false",此 Valve 可以根据是否存在有效的 SSO cookie 自行认证请求,而无需重新检查 Realm

cookieDomain

设置用于 sso cookie 的主机域。

cookieName

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

认证

本节中的 Valve 实现了 org.apache.catalina.Authenticator 接口。

基本认证器 Valve

简介

Basic Authenticator Valve 会自动添加到配置为使用 BASIC 认证的任何 Context

如果需要任何非默认设置,可以在 Context 元素中配置 Valve 并设置所需值。

属性

Basic Authenticator Valve 支持以下配置属性

属性描述
allowCorsPreflight

是否允许看起来是 CORS 预检请求的请求绕过认证器,这根据 CORS 规范的要求。允许的值为 neverfilteralwaysnever 表示即使请求看起来是 CORS 预检请求,也永远不会绕过认证。filter 表示如果请求看起来是 CORS 预检请求;它映射到已启用 CORS 过滤器的 Web 应用程序;并且请求与 CORS 过滤器映射器的 URLPatterns 匹配,则请求将绕过认证。always 表示所有看起来是 CORS 预检请求的请求都将绕过认证。如果未设置,默认值为 never

alwaysUseSession

一旦用户通过认证,是否始终使用会话?这可能会提供一些性能优势,因为会话可以用于缓存已认证的主体,从而无需在每个请求中通过 Realm 认证用户。这可能有助于 BASIC 认证与 JNDIRealm 或 DataSourceRealms 结合使用。但是,也会产生创建和垃圾回收会话的性能开销。如果未设置,将使用默认值 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 从字节转换为字符。默认值为 UTF-8

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

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

secureRandomProvider

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

sendAuthInfoResponseHeaders

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

摘要认证器 Valve

简介

Digest Authenticator Valve 会自动添加到配置为使用 DIGEST 认证的任何 Context

如果需要任何非默认设置,可以在 Context 元素中配置 Valve 并设置所需值。

属性

Digest Authenticator Valve 支持以下配置属性

属性描述
algorithms

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

allowCorsPreflight

是否允许看起来是 CORS 预检请求的请求绕过认证器,这根据 CORS 规范的要求。允许的值为 neverfilteralwaysnever 表示即使请求看起来是 CORS 预检请求,也永远不会绕过认证。filter 表示如果请求看起来是 CORS 预检请求;它映射到已启用 CORS 过滤器的 Web 应用程序;并且请求与 CORS 过滤器映射器的 URLPatterns 匹配,则请求将绕过认证。always 表示所有看起来是 CORS 预检请求的请求都将绕过认证。如果未设置,默认值为 never

alwaysUseSession

一旦用户通过认证,是否始终使用会话?这可能会提供一些性能优势,因为会话可以用于缓存已认证的主体,从而无需在每个请求中通过 Realm 认证用户。这可能有助于 BASIC 认证与 JNDIRealm 或 DataSourceRealms 结合使用。但是,也会产生创建和垃圾回收会话的性能开销。如果未设置,将使用默认值 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 分钟)。

opaque

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

securePagesWithPragma

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

secureRandomAlgorithm

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

secureRandomClass

用于生成 SSO 会话 ID 的扩展 java.security.SecureRandom 的 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 认证始终失败时才应设置此值。

表单认证器 Valve

简介

Form Authenticator Valve 会自动添加到配置为使用 FORM 认证的任何 Context

如果需要任何非默认设置,可以在 Context 元素中配置 Valve 并设置所需值。

属性

Form Authenticator Valve 支持以下配置属性

属性描述
allowCorsPreflight

是否允许看起来是 CORS 预检请求的请求绕过认证器,这根据 CORS 规范的要求。允许的值为 neverfilteralwaysnever 表示即使请求看起来是 CORS 预检请求,也永远不会绕过认证。filter 表示如果请求看起来是 CORS 预检请求;它映射到已启用 CORS 过滤器的 Web 应用程序;并且请求与 CORS 过滤器映射器的 URLPatterns 匹配,则请求将绕过认证。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 认证过程的行为,如果过程被误用,例如直接请求登录页面或登录延迟过长导致会话过期。如果设置了此属性,当登录表单提交了有效凭据时,Tomcat 将把用户重定向到指定的登录页面,而不是返回错误响应码。为了处理登录,登录页面必须是一个受保护的资源(即需要认证的资源)。如果登录页面不需要认证,则用户将不会登录,并且当他们访问受保护页面时将再次提示输入凭据。

securePagesWithPragma

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

secureRandomAlgorithm

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

secureRandomClass

用于生成 SSO 会话 ID 的扩展 java.security.SecureRandom 的 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 认证器 Valve

简介

SSL Authenticator Valve 会自动添加到配置为使用 SSL 认证的任何 Context

如果需要任何非默认设置,可以在 Context 元素中配置 Valve 并设置所需值。

属性

SSL Authenticator Valve 支持以下配置属性

属性描述
allowCorsPreflight

是否允许看起来是 CORS 预检请求的请求绕过认证器,这根据 CORS 规范的要求。允许的值为 neverfilteralwaysnever 表示即使请求看起来是 CORS 预检请求,也永远不会绕过认证。filter 表示如果请求看起来是 CORS 预检请求;它映射到已启用 CORS 过滤器的 Web 应用程序;并且请求与 CORS 过滤器映射器的 URLPatterns 匹配,则请求将绕过认证。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

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

secureRandomProvider

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

SPNEGO Valve

简介

SPNEGO Authenticator Valve 会自动添加到配置为使用 SPNEGO 认证的任何 Context

如果需要任何非默认设置,可以在 Context 元素中配置 Valve 并设置所需值。

属性

SPNEGO Authenticator Valve 支持以下配置属性

属性描述
allowCorsPreflight

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

alwaysUseSession

一旦用户通过认证,是否始终使用会话?这可能会提供一些性能优势,因为会话可以用于缓存已认证的主体,从而无需在每个请求中认证用户。这也有助于假定服务器将缓存已认证用户的客户端。但是,也会产生创建和垃圾回收会话的性能开销。有关替代解决方案,请参阅 noKeepAliveUserAgents。如果未设置,默认值为 false

applyJava8u40Fix

Java 8 update 40 (JDK-8048194) 及更高版本中引入的一个修复破坏了 Tomcat 在 Windows 2008 R2 服务器上运行时的 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 不会这样做。如果应用程序创建了会话,或者为此 Authenticator 启用了 alwaysUseSession,则会话将可用。

作为创建会话的替代方案,此属性可用于定义禁用 HTTP keep-alive 的用户代理。这意味着连接将仅用于单个请求,因此无法按连接缓存已认证的用户信息。禁用 HTTP keep-alive 会带来性能开销。

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

securePagesWithPragma

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

secureRandomAlgorithm

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

secureRandomClass

用于生成 SSO 会话 ID 的扩展 java.security.SecureRandom 的 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

错误报告 Valve

简介

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

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

属性

错误报告阀 (Error Report Valve) 支持以下配置属性

属性描述
className

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

errorCode.nnn

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

exceptionType.fullyQualifiedClassName

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

showReport

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

showServerInfo

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

Json 错误报告 Valve

简介

Json 错误报告阀 (Json Error Report Valve) 是一个简单的 HTTP 状态码错误处理器,它将返回 Json 错误消息。

通过在 HosterrorReportValveClass 属性中指定此类别,它将替代 ErrorReportValve 使用,并返回 JSON 响应而不是 HTML。

属性

Json 错误报告阀 (Json Error Report Valve) 支持以下配置属性

属性描述
className

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

代理错误报告 Valve

简介

代理错误报告阀 (Proxy Error Report Valve) 是一个简单的 HTTP 状态码错误处理器,它将重定向或代理到负责生成错误报告的另一个位置。

通过在 HosterrorReportValveClass 属性中指定此类别,它将替代 ErrorReportValve 使用默认属性值。要配置这些属性,该阀可以在 Host 元素中嵌套定义。

属性

代理错误报告阀 (Proxy Error Report Valve) 支持以下配置属性

属性描述
className

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

usePropertiesFile

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

useRedirect

如果为 true,该阀将发送重定向到该 URL。如果为 false,该阀将转而代理指定 URL 的内容。默认值为 true

配置

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

爬虫会话管理器 Valve

简介

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

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

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

属性

爬虫会话管理器阀 (Crawler Session Manager Valve) 支持以下配置属性

属性描述
className

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

contextAware

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

crawlerIps

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

crawlerUserAgents

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

hostAware

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

sessionInactiveInterval

爬虫会话管理器阀在内存中保持客户端 IP 到会话 ID 映射的最小时间(秒),在此期间客户端没有任何活动。客户端 IP/会话缓存将定期清除在此间隔内不活跃的映射。如果未指定,将使用默认值 60

阻塞线程检测 Valve

简介

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

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

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

属性

卡住线程检测阀 (Stuck Thread Detection Valve) 支持以下配置属性

属性描述
className

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

threshold

线程被视为卡住的最小持续时间(秒)。默认值为 600 秒。如果设置为 0,则禁用检测。

注意:由于检测(和可选中断)是在声明此阀的容器(Engine、Host 或 Context)的后台线程中完成的,因此阈值应高于此容器的 backgroundProcessorDelay

interruptThreadThreshold

卡住线程应被中断以尝试“释放”它的最小持续时间(秒)。

请注意,不能保证线程会解除卡住。这通常对于卡在 I/O 或锁上的线程有效,但在无限循环的情况下可能无用。

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

信号量 Valve

简介

信号量阀 (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

健康检查 Valve

简介

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

属性

健康检查阀 (Health Check Valve) 支持以下配置属性

属性描述
className

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

path

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

checkContainersAvailable

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

持久化 Valve

简介

持久化阀 (PersistentValve) 实现了每请求会话持久化。它旨在与非粘性负载均衡器一起使用。

属性

持久化阀 (PersistentValve Valve) 支持以下配置属性

属性描述
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

参数限制 Valve

简介

参数限制阀 (Parameter Limit Valve) 用于限制 HTTP 请求中允许的参数数量,覆盖连接器的值。该阀可以针对某些 URL 模式配置特定的限制。超出定义参数限制的请求将导致 HTTP 400 Bad Request 错误。

属性

参数限制阀 (Parameter Limit Valve) 支持以下配置属性

属性描述
className

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

resourcePath

一个由行分隔的 URL 模式及其各自的参数限制组成的文件。每个条目应遵循 urlPattern=limit 格式。当请求匹配某个 URL 模式时,阀将应用为该模式定义的限制。如果没有模式匹配,将使用连接器的限制。例如: /api/.*=100 /admin/.*=50 /upload/.*=30,5,1024 默认值:parameter_limit.config。它必须放置在 Host 配置文件夹或 Web 应用程序的 WEB-INF 文件夹中。

如果提供单个整数,则将其用于 maxParameterCount。如果提供三个整数,则它们分别应用于 maxParameterCountmaxPartCountmaxPartHeaderSize