阀门组件
目录
简介
Valve 元素表示将插入到关联的 Catalina 容器(Engine、Host 或 Context)的请求处理管道中的组件。各个 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 容器(Context
、Host
或 Engine
)相关联,并将记录该容器处理的所有请求。
在将某些请求传递给容器之前,Tomcat 可能会处理这些请求。这些请求包括从 /foo 重定向到 /foo/,以及拒绝无效请求。在 Tomcat 可以识别将处理请求的 Context
的情况下,请求/响应将记录在与 Context
、Host
和 Engine
关联的 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 |
标志,用于确定是否将日志缓冲。如果设置为 |
className |
要使用的实现的 Java 类名。必须将其设置为 org.apache.catalina.valves.AccessLogValve 才能使用默认访问日志阀。 |
condition |
与 |
conditionIf |
打开条件记录。如果设置,只有当 |
conditionUnless |
打开条件记录。如果设置,只有当 |
directory |
此阀门创建的日志文件所在的目录的绝对或相对路径名。如果指定相对路径,则解释为相对于 $CATALINA_BASE。如果未指定目录属性,则默认值为“logs”(相对于 $CATALINA_BASE)。 |
encoding |
用于写入日志文件的字符集。空字符串表示使用默认字符集。默认值:UTF-8。 |
fileDateFormat |
允许在访问日志文件名中使用自定义时间戳。每当格式化的时间戳更改时,文件就会轮转。默认值为 |
ipv6Canonical |
标志,用于确定是否应以 RFC 5952 定义的规范表示格式表示 IPv6 地址。如果设置为 |
locale |
用于格式化访问日志行中时间戳的语言环境。使用显式 SimpleDateFormat 模式( |
maxDays |
轮转访问日志将被保留的最大天数,然后删除。如果未指定,将使用默认值 |
maxLogMessageBufferSize |
日志消息缓冲区通常会被回收和重新使用。为了防止过度使用内存,如果缓冲区增长超过此大小,它将被丢弃。默认值为 |
pattern |
一种格式化布局,用于标识要记录的请求和响应中的各种信息字段,或单词 |
前缀 |
添加到每个日志文件名称开头的前缀。如果未指定,则默认值为“access_log”。 |
renameOnRotate |
对于可轮换日志,默认情况下,活动访问日志文件名称将包含 |
requestAttributesEnabled |
设置为 |
resolveHosts |
此属性不再受支持。请改用连接器属性 如果已将连接器上的 |
rotatable |
确定是否应进行日志轮换的标志。如果设置为 |
后缀 |
添加到每个日志文件名称末尾的后缀。如果未指定,则默认值为 ""(零长度字符串),这意味着不会添加后缀。 |
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"
将 Referer
和 User-Agent
标头的值(每个都用双引号引起来)附加到 common
模式。
使用未知模式标识符的字段将记录为 ???X???
,其中 X
是未知标识符。具有未知模式标识符和 {xxx}
键的字段将记录为 ???
。
当 Tomcat 在反向代理后面运行时,Access Log Valve 记录的客户端信息可能表示反向代理、浏览器或两者的某种组合,具体取决于 Tomcat 和反向代理的配置。有关 Tomcat 配置选项,请参阅 代理支持 和 代理操作方法。对于使用 mod_jk 的反向代理,请参阅 通用代理 文档。对于其他反向代理,请查阅其文档。
扩展访问日志阀门
简介
属性
扩展访问日志阀支持标准 访问日志阀 的所有配置属性。只有用于 className
和 pattern
的值不同。
属性 | 说明 |
---|---|
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)
: getAuthTypex-H(characterEncoding)
: getCharacterEncodingx-H(contentLength)
: getContentLengthx-H(locale)
: getLocalex-H(protocol)
: getProtocolx-H(remoteUser)
: getRemoteUserx-H(requestedSessionId)
: getRequestedSessionIdx-H(requestedSessionIdFromCookie)
: isRequestedSessionIdFromCookiex-H(requestedSessionIdValid)
: isRequestedSessionIdValidx-H(scheme)
: getSchemex-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 访问日志阀支持标准 访问日志阀 的所有配置属性。只有用于 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 转义。
- 模式标识符之间的任何逐字文本都会被静默忽略。
%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
%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 地址与其进行比较的正则表达式(使用 |
deny |
远程客户端的 IP 地址与其进行比较的正则表达式(使用 |
denyStatus |
拒绝拒绝的请求时使用的 HTTP 响应状态代码。默认值为 |
addConnectorPort |
将服务器连接器端口附加到客户端 IP 地址,并用分号 (";") 分隔。如果将其设置为 |
invalidAuthenticationWhenDeny |
当请求应该被拒绝时,不要拒绝,而是设置一个无效的 这可以与 |
usePeerAddress |
使用连接对等地址,而不是客户端 IP 地址。如果在 Tomcat 前面使用反向代理与 AJP 协议或 HTTP 协议以及 |
示例 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 查找”功能。
属性
远程主机阀支持以下配置属性
属性 | 说明 |
---|---|
className |
要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.RemoteHostValve。 |
allow |
一个正则表达式(使用 |
deny |
一个正则表达式(使用 |
denyStatus |
拒绝拒绝的请求时使用的 HTTP 响应状态代码。默认值为 |
addConnectorPort |
将服务器连接器端口附加到客户端主机名,以分号 (";") 分隔。如果将其设置为 |
invalidAuthenticationWhenDeny |
当请求应该被拒绝时,不要拒绝,而是设置一个无效的 这可以与 |
远程 CIDR 阀门
简介
远程 CIDR 阀门允许您将提交此请求的客户端的 IP 地址与一个或多个遵循 CIDR 表示法的网络掩码进行比较,并允许请求继续或拒绝处理此客户端的请求。IPv4 和 IPv6 均得到完全支持。远程 CIDR 阀门可以与任何 Catalina 容器(引擎、主机 或 上下文)相关联,并且必须接受提交给此容器以进行处理的任何请求,然后才能将其传递。
此阀门模拟 Apache 的 Order
、Allow from
和 Deny 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 地址(
::1
、fe80::/71
等)。
属性
远程 CIDR 阀门支持以下配置属性
属性 | 说明 |
---|---|
className |
要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.valves.RemoteCIDRValve。 |
allow |
远程客户端的 IP 地址与之匹配的 IPv4 或 IPv6 网络掩码或地址的逗号分隔列表。如果指定此属性,则远程地址必须匹配才能接受此请求。如果未指定此属性,则将接受所有请求,除非远程 IP 与 |
deny |
远程客户端的 IP 地址与之匹配的 IPv4 或 IPv6 网络掩码或地址的逗号分隔列表。如果指定此属性,则远程地址不得匹配才能接受此请求。如果未指定此属性,则请求接受仅受 |
denyStatus |
拒绝拒绝的请求时使用的 HTTP 响应状态代码。默认值为 |
addConnectorPort |
将服务器连接器端口附加到客户端 IP 地址,并用分号 (";") 分隔。如果将其设置为 |
invalidAuthenticationWhenDeny |
当请求应该被拒绝时,不要拒绝,而是设置一个无效的 这可以与 |
usePeerAddress |
使用连接对等地址,而不是客户端 IP 地址。如果在 Tomcat 前面使用反向代理与 AJP 协议或 HTTP 协议以及 |
示例 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 |
当与 |
远程 IP 阀门
简介
Tomcat 端口为 mod_remoteip,此阀门使用代理或负载均衡器通过请求标头(例如“X-Forwarded-For”)提供的 IP 地址列表替换请求的明显客户端远程 IP 地址和主机名。
此阀门的另一个功能是使用代理或负载均衡器通过请求标头(例如“X-Forwarded-Proto”)提供的方案替换明显的方案(http/https)、服务器端口和 request.secure
。
此阀门可根据需要在 Engine
、Host
或 Context
级别使用。通常,此阀门将在 Engine
级别使用。
如果与远程地址/主机阀门结合使用,则应首先定义此阀门,以确保将正确的客户端 IP 地址呈现给远程地址/主机阀门。
注意:默认情况下,此阀门对写入访问日志的值没有影响。当请求处理离开阀门时,原始值将被还原,并且这总是早于访问日志记录。要将此阀门设置的远程地址、远程主机、服务器端口和协议值传递到访问日志,它们将被放入请求属性中。默认情况下启用在此处发布这些值,但应明确配置 AccessLogValve
以使用它们。请参阅 AccessLogValve
的 requestAttributesEnabled
属性的文档。
此阀门设置的请求属性的名称可供访问日志使用,如下所示
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 地址列表。如果未指定,则使用默认值 |
internalProxies |
正则表达式(使用 |
proxiesHeader |
此阀创建的 HTTP 标头名称,用于保存已在传入 remoteIpHeader 中处理的代理列表。如果未指定,则使用默认值 |
requestAttributesEnabled |
设置为 |
trustedProxies |
正则表达式(使用 |
protocolHeader |
此阀读取的 HTTP 标头名称,其中包含客户端用于连接到代理的协议。如果未指定,则使用默认值 |
hostHeader |
此阀读取的 HTTP 标头名称,其中包含客户端用于连接到代理的主机。如果未指定,则使用默认值 |
portHeader |
此阀读取的 HTTP 标头名称,其中包含客户端用于连接到代理的端口。如果未指定,则使用默认值 |
protocolHeaderHttpsValue |
protocolHeader 的值,用于指示它是 HTTPS 请求。如果未指定,则使用默认值 |
httpServerPort |
当 protocolHeader 指示 |
httpsServerPort |
当 protocolHeader 指示 |
changeLocalName |
如果为 |
changeLocalPort |
如果为 |
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 头设置自定义名称。如果未指定,则使用默认值 |
sslClientEscapedCertHeader |
允许为 ssl_client_escaped_cert 头设置自定义名称。如果未指定,则使用默认值 此头对 Nginx 代理很有用,并且优先于 ssl_client_cert 头。 |
sslCipherHeader |
允许为 ssl_cipher 头设置自定义名称。如果未指定,则使用默认值 |
sslSessionIdHeader |
允许为 ssl_session_id 头设置自定义名称。如果未指定,则使用默认值 |
sslCipherUserKeySizeHeader |
允许为 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 名称。默认值为 |
身份验证
本部分中的阀实现org.apache.catalina.Authenticator 接口。
基本身份验证器阀门
属性
基本身份验证器阀支持以下配置属性
属性 | 说明 |
---|---|
allowCorsPreflight |
允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 |
alwaysUseSession |
用户经过身份验证后是否始终使用会话?这可能会提供一些性能优势,因为会话可用于缓存经过身份验证的主体,因此无需在每次请求时通过领域对用户进行身份验证。这可能有助于使用 JNDIRealm 或 DataSourceRealms 的基本身份验证等组合。但是,创建和 GC 会话也会有性能成本。如果未设置,将使用默认值 |
cache |
如果请求是 HTTP 会话的一部分,我们是否应该缓存经过身份验证的主体?如果未指定,将使用默认值 |
changeSessionIdOnAuthentication |
控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 |
charset |
控制 |
className |
要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.authenticator.BasicAuthenticator。 |
disableProxyCaching |
控制受安全约束保护的页面的缓存。将其设置为 |
jaspicCallbackHandlerClass |
JASPIC 应使用的 |
securePagesWithPragma |
控制受安全约束保护的页面的缓存。将其设置为 |
secureRandomAlgorithm |
用于创建生成会话 ID 的 |
secureRandomClass |
扩展 |
secureRandomProvider |
用于创建生成 SSO 会话 ID 的 |
sendAuthInfoResponseHeaders |
控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 |
trimCredentials |
控制是否从解析的凭据中删除前导和/或尾随空格。如果未指定,则默认值为 注意:此属性将从 Tomcat 11 起删除。 |
摘要身份验证器阀门
属性
摘要身份验证器阀门支持以下配置属性
属性 | 说明 |
---|---|
algorithms |
用于身份验证过程的摘要算法的逗号分隔列表。可以使用 Java 标准名称或 RFC 7616 使用的名称指定算法。如果未指定,则将使用默认值 |
allowCorsPreflight |
允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 |
alwaysUseSession |
用户经过身份验证后是否始终使用会话?这可能会提供一些性能优势,因为会话可用于缓存经过身份验证的主体,因此无需在每次请求时通过领域对用户进行身份验证。这可能有助于使用 JNDIRealm 或 DataSourceRealms 的基本身份验证等组合。但是,创建和 GC 会话也会有性能成本。如果未设置,将使用默认值 |
cache |
如果请求是 HTTP 会话的一部分,我们是否应缓存经过身份验证的主体?如果未指定,则将使用默认值 |
changeSessionIdOnAuthentication |
控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 |
className |
要使用的实现的 Java 类名。这必须设置为 org.apache.catalina.authenticator.DigestAuthenticator。 |
disableProxyCaching |
控制受安全约束保护的页面的缓存。将其设置为 |
jaspicCallbackHandlerClass |
JASPIC 应使用的 |
key |
摘要身份验证使用的密钥。如果未设置,则会生成一个安全随机值。通常只有在有必要在服务器重新启动和/或集群中保持密钥值不变时才应设置此值。 |
nonceCacheSize |
为了防止重放攻击,DIGEST 身份验证器会跟踪服务器随机数和随机数计数值。此属性控制该缓存的大小。如果未指定,则使用默认值 1000。 |
nonceCountWindowSize |
客户端请求可能会乱序处理,这意味着随机数计数值也可能会乱序处理。为了防止在随机数计数乱序呈现时出现身份验证失败,身份验证器会跟踪随机数计数值的窗口。此属性控制该窗口的大小。如果未指定,则使用默认值 100。 |
nonceValidity |
服务器生成的随机数在身份验证中被视为有效的毫秒数。如果未指定,则将使用默认值 300000(5 分钟)。 |
不透明 |
摘要验证使用的服务器不透明字符串。如果没有设置,将生成一个随机值。通常只在需要在服务器重启和/或群集之间保持不透明值不变时才设置此值。 |
securePagesWithPragma |
控制受安全约束保护的页面的缓存。将其设置为 |
secureRandomAlgorithm |
用于创建生成会话 ID 的 |
secureRandomClass |
扩展 |
secureRandomProvider |
用于创建生成 SSO 会话 ID 的 |
sendAuthInfoResponseHeaders |
控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 |
validateUri |
是否应根据 RFC2617 验证 URI?如果没有指定,将使用默认值 |
表单身份验证器阀门
属性
表单验证器阀门支持以下配置属性
属性 | 说明 |
---|---|
allowCorsPreflight |
允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 |
authenticationSessionTimeout |
如果验证过程创建会话,这是验证过程中的最大会话超时时间(以秒为单位)。一旦验证完成,将应用默认会话超时时间。在验证过程开始之前存在的会话将始终保留其原始会话超时时间。如果没有设置,将使用默认值 |
changeSessionIdOnAuthentication |
控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 |
characterEncoding |
用于从请求中读取用户名和密码参数的字符编码。如果没有设置,将使用请求正文的编码。 |
className |
要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.authenticator.FormAuthenticator。 |
disableProxyCaching |
控制受安全约束保护的页面的缓存。将其设置为 |
jaspicCallbackHandlerClass |
JASPIC 应使用的 |
landingPage |
如果 FORM 验证过程被误用(例如直接请求登录页面或延迟登录时间过长以致会话过期),则控制 FORM 验证过程的行为。如果设置此属性,Tomcat 不会返回错误响应代码,而是在使用有效凭据提交登录表单时将用户重定向到指定的登录页面。要处理登录,登录页面必须是受保护的资源(即需要验证的资源)。如果登录页面不需要验证,则用户将不会登录,并且在访问受保护页面时会再次提示他们输入凭据。 |
securePagesWithPragma |
控制受安全约束保护的页面的缓存。将其设置为 |
secureRandomAlgorithm |
用于创建生成会话 ID 的 |
secureRandomClass |
扩展 |
secureRandomProvider |
用于创建生成 SSO 会话 ID 的 |
sendAuthInfoResponseHeaders |
控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 |
SSL 身份验证器阀门
属性
SSL 验证器阀门支持以下配置属性
属性 | 说明 |
---|---|
allowCorsPreflight |
允许符合 CORS 规范要求的、看似 CORS 预检请求的请求绕过身份验证器。允许的值为 |
cache |
如果请求是 HTTP 会话的一部分,我们是否应该缓存经过身份验证的主体?如果未指定,将使用默认值 |
className |
要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.authenticator.SSLAuthenticator。 |
changeSessionIdOnAuthentication |
控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 |
disableProxyCaching |
控制受安全约束保护的页面的缓存。将其设置为 |
jaspicCallbackHandlerClass |
JASPIC 应使用的 |
securePagesWithPragma |
控制受安全约束保护的页面的缓存。将其设置为 |
secureRandomAlgorithm |
用于创建生成会话 ID 的 |
secureRandomClass |
扩展 |
secureRandomProvider |
用于创建生成 SSO 会话 ID 的 |
SPNEGO 阀门
属性
SPNEGO 认证阀支持以下配置属性
属性 | 说明 |
---|---|
allowCorsPreflight |
是否允许看起来像是 CORS 预检请求的请求绕过认证器,这是 CORS 规范的要求。允许的值为 |
alwaysUseSession |
用户经过认证后是否应始终使用会话?这可能会带来一些性能优势,因为随后可以使用会话来缓存经过认证的主体,从而无需在每个请求上对用户进行认证。这还有助于假定服务器将缓存经过认证用户的客户端。但是,创建和 GC 会话也会产生性能成本。有关备选解决方案,请参阅 |
applyJava8u40Fix |
Java 8 更新 40 (JDK-8048194) 中引入的一个修复程序中断了在 Windows 2008 R2 服务器上运行的 Tomcat 的 IE SPNEGO 认证。此选项启用了一个解决方法,使 SPNEGO 认证能够继续工作。该解决方法不应影响其他配置,因此默认情况下已启用。如有必要,可以通过将此属性设置为 |
cache |
如果请求是 HTTP 会话的一部分,我们是否应该缓存经过身份验证的主体?如果未指定,将使用默认值 |
className |
要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.authenticator.SpnegoAuthenticator。 |
changeSessionIdOnAuthentication |
控制在用户经过身份验证时是否存在会话时是否更改会话 ID。这是为了防止会话固定攻击。如果未设置,将使用默认值 |
disableProxyCaching |
控制受安全约束保护的页面的缓存。将其设置为 |
jaspicCallbackHandlerClass |
JASPIC 应使用的 |
loginConfigName |
用作服务的登录的 JAAS 登录配置的名称。如果未指定,则使用默认值 |
noKeepAliveUserAgents |
某些客户端(不是大多数浏览器)希望服务器为连接缓存经过认证的用户信息,并且不会在每次请求中重新发送凭据。除非有 HTTP 会话可用,否则 Tomcat 不会这样做。如果应用程序创建会话或为此认证器启用了 作为创建会话的备选方案,此属性可用于定义禁用 HTTP 保持活动状态的用户代理。这意味着连接将仅用于单个请求,因此无法按连接缓存经过认证的用户信息。禁用 HTTP 保持活动状态将产生性能成本。 该属性应为匹配整个用户代理字符串的正则表达式,例如 |
securePagesWithPragma |
控制受安全约束保护的页面的缓存。将其设置为 |
secureRandomAlgorithm |
用于创建生成会话 ID 的 |
secureRandomClass |
扩展 |
secureRandomProvider |
用于创建生成 SSO 会话 ID 的 |
sendAuthInfoResponseHeaders |
控制是否将身份验证信息(远程用户和身份验证类型)作为转发/代理请求的响应头返回。当 |
storeDelegatedCredential |
控制是否将用户的委派凭证存储在用户主体中。如果可用,则应用程序可以通过 |
错误报告阀门
简介
错误报告阀是针对 HTTP 状态代码的简单错误处理程序,它将生成并返回 HTML 错误页面。它还可以配置为针对特定状态代码和/或异常类型返回预定义的静态 HTML 页面。
注意:同时禁用 showServerInfo 和 showReport 将仅返回 HTTP 状态代码。
属性
错误报告阀支持以下配置属性
属性 | 说明 |
---|---|
className |
要使用的实现的 Java 类名。必须将其设置为 org.apache.catalina.valves.ErrorReportValve 才能使用默认错误报告阀。 |
errorCode.nnn |
用于返回 |
exceptionType.fullyQualifiedClassName |
如果发生错误并且 |
showReport |
当发生错误时,确定是否显示错误报告(自定义错误消息和/或堆栈跟踪)的标志。如果设置为 |
showServerInfo |
当发生错误时确定是否显示服务器信息的标志。如果设置为 |
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 |
如果为 |
useRedirect |
如果为 |
配置
代理错误报告阀可以使用类路径中的资源文件 ProxyErrorReportValve.properties,其中每个条目都是 statusCode=baseUrl。baseUrl 不应包含任何 url 参数、statusCode、statusDescription、requestUri 和 throwable,这些将自动附加。应使用名为 0
的特殊键将任何其他未映射的代码与重定向或代理 URL 匹配。
爬虫会话管理器阀门
简介
网络爬虫在抓取网站时可能会触发创建数千个会话,这可能会导致大量的内存消耗。此阀确保爬虫与单个会话关联起来,就像普通用户一样,无论他们是否在其请求中提供了会话令牌。
此阀门可根据需要在 Engine
、Host
或 Context
级别使用。通常,此阀门将在 Engine
级别使用。
如果与远程 IP 阀一起使用,则应在此阀之前定义远程 IP 阀,以确保向此阀提供正确的客户端 IP 地址。
属性
爬虫会话管理器阀支持以下配置属性
属性 | 说明 |
---|---|
className |
要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.CrawlerSessionManagerValve。 |
contextAware |
标志,用于将上下文名称与客户端 IP 一起使用来识别要重新使用的会话。可以与 |
crawlerIps |
正则表达式(使用 |
crawlerUserAgents |
正则表达式(使用 |
hostAware |
标志,用于将配置的主机与客户端 IP 一起使用以识别要重新使用的会话。可以与 |
sessionInactiveInterval |
Crawler Session Manager Valve 应在内存中将客户端 IP 映射到会话 ID 的最短时间(以秒为单位),且客户端没有任何活动。客户端 IP/会话缓存将定期清除已处于非活动状态超过此时间间隔的映射。如果未指定,则使用默认值 |
卡住的线程检测阀门
简介
此阀允许检测处理时间过长的请求,这可能表明正在处理它的线程已卡住。此外,它还可以选择中断此类线程以尝试解除其阻塞。
当检测到此类请求时,其线程的当前堆栈跟踪将以 WARN 级别写入 Tomcat 日志。
可以通过 JMX 在 stuckThreadIds
和 stuckThreadNames
属性中获取卡住线程的 ID 和名称。ID 可与标准线程 JVM MBean(java.lang:type=Threading
)一起使用,以检索有关每个卡住线程的其他信息。
属性
卡住线程检测阀支持以下配置属性
属性 | 说明 |
---|---|
className |
要使用的实现的 Java 类名。此项必须设置为 org.apache.catalina.valves.StuckThreadDetectionValve。 |
threshold |
以秒为单位的最小持续时间,在此之后线程被视为卡住。默认值为 600 秒。如果设置为 0,则禁用检测。 注意:由于检测(和可选的中断)是在声明此阀门的容器(引擎、主机或上下文)的后台线程中完成的,因此阈值应高于此容器的 |
interruptThreadThreshold |
卡住的线程在尝试“释放”它之前被中断的最小持续时间(以秒为单位)。 请注意,无法保证线程会解除卡住状态。这通常适用于卡在 I/O 或锁上的线程,但对于无限循环可能无用。 默认值为 -1,禁用此功能。要启用它,该值必须大于或等于 |
信号量阀门
简介
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 |
如果为 |
持久性阀门
简介
实现按请求会话持久性的 PersistentValve。它旨在与非粘性负载均衡器一起使用。
属性
PersistentValve 阀支持以下配置属性
属性 | 说明 |
---|---|
className |
要使用的实现的 Java 类名称。此项必须设置为 org.apache.catalina.valves.PersistentValve。 |
filter |
对于已知的文件扩展名或 URL,可以使用此过滤器模式通知阀,此请求期间不需要会话。如果请求与此过滤器模式匹配,则阀会假定没有必要恢复会话。示例过滤器可能如下所示: |
semaphoreAcquireUninterruptibly |
标志,用于确定等待每个会话的信号量时阻塞的线程是否应不间断地执行此操作。如果 semaphoreBlockOnAcquire 为 |
semaphoreBlockOnAcquire |
标志,用于确定当另一个线程持有每个会话的信号量时希望获取该信号量的线程是否应阻塞,直到它可以获取信号量,或者是否应拒绝等待请求。如果未指定,则将使用默认值 |
semaphoreFairness |
标志,用于确定每个会话的信号量是否将按照接收信号量请求的顺序授予请求。如果 semaphoreBlockOnAcquire 为 |