Valve 組件
目錄
簡介
Valve 元素代表將插入關聯的 Catalina 容器 (引擎、主機 或 內容) 的請求處理管線中的組件。個別 Valve 具有不同的處理功能,並在下方個別說明。
以下說明使用變數名稱 $CATALINA_BASE 來指大部分相對路徑解析的基礎目錄。如果您尚未透過設定 CATALINA_BASE 目錄來設定 Tomcat 的多個執行個體,則 $CATALINA_BASE 會設定為 $CATALINA_HOME 的值,也就是您安裝 Tomcat 的目錄。
存取記錄
存取記錄是由實作 org.apache.catalina.AccessLog 介面的 Valve 執行的。
存取記錄 Valve
簡介
存取記錄閥會以與標準網路伺服器相同的格式建立記錄檔。這些記錄檔之後可由標準記錄檔分析工具分析,以追蹤頁面點閱次數、使用者會話活動等。此閥
使用獨立的邏輯來寫入其記錄檔,這些記錄檔每天可在午夜自動輪替。(存取記錄的基本需求是處理大量連續資料串流,且負載低。此閥
不使用 Apache Commons Logging,因此可避免額外的負載和潛在複雜的組態)。
此閥
可以與任何 Catalina 容器(Context
、Host
或 Engine
)關聯,並會記錄由該容器處理的所有要求。
有些要求可能會在傳遞給容器之前由 Tomcat 處理。這些要求包括從 /foo 到 /foo/ 的重新導向,以及拒絕無效的要求。在 Tomcat 可以識別會處理要求的Context
時,要求/回應會記錄在關聯的Context
、Host
和Engine
的AccessLog
中。在 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 |
旗標,用於判斷 IPv6 位址是否應以 RFC 5952 定義的標準表示格式表示。如果設定為 |
locale |
用於在存取記錄行中格式化時間戳記的地區設定。使用明確的 SimpleDateFormat 模式( |
maxDays |
輪替存取記錄所保留的最大天數,超過後會刪除。如果未指定,會使用預設值 |
maxLogMessageBufferSize |
記錄訊息緩衝區通常會回收再利用。為避免過度使用記憶體,如果緩衝區成長超過此大小,它將會被捨棄。預設值為 |
樣式 |
一個格式化配置,用於識別要記錄的請求和回應的各種資訊欄位,或字詞 |
前置字元 |
新增至每個記錄檔名稱開頭的前置字元。如果未指定,預設值為「access_log」。 |
旋轉時重新命名 |
對於可旋轉記錄檔,預設值是活動存取記錄檔名稱會包含 |
已啟用請求屬性 |
設定為 |
解析主機 |
此屬性不再受支援。請改用連接器屬性 如果連接器上的 |
可旋轉 |
旗標用於判斷是否應執行記錄旋轉。如果設定為 |
後置字元 |
新增至每個記錄檔名稱結尾的後置字元。如果未指定,預設值為「」(零長度字串),表示不會新增後置字元。 |
pattern
屬性的值由文字字串組成,加上以「%」字元為前置字元的樣式識別碼,以致於由目前請求和回應中對應的變數值取代。支援下列樣式碼
%a
- 遠端 IP 位址。另請參閱下方%{xxx}a
。%A
- 本機 IP 位址%b
- 已傳送的位元組(不含 HTTP 標頭),或在為零時為「-」%B
- 傳送的位元組數,不含 HTTP 標頭%D
- 處理要求所花費的時間(微秒)%F
- 提交回應所花費的時間(毫秒)%h
- 遠端主機名稱(或 IP 位址,如果連接器的enableLookups
為 false)%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 伺服器 的記錄組態語法。每個範例都可以使用多次,搭配不同的 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 的反向代理伺服器,請參閱 通用代理伺服器 文件。對於其他反向代理伺服器,請參閱其文件。
延伸存取記錄 Valve
簡介
Extended Access Log Valve 擴充 Access Log Valve 類別,因此使用相同的自含記錄邏輯。這表示它實作許多相同的檔案處理屬性。與標準 AccessLogValve
的主要差異在於 ExtendedAccessLogValve
會建立符合 W3C 定義的 擴充記錄檔格式 工作草案的記錄檔。
屬性
Extended Access Log Valve 支援標準 Access Log Valve 的所有組態屬性。只有用於 className
和 pattern
的值不同。
屬性 | 說明 |
---|---|
className |
實作要使用的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.ExtendedAccessLogValve,才能使用延伸的存取記錄閥門。 |
樣式 |
格式化配置,識別要記錄的請求和回應的各種資訊欄位。請參閱下方,以取得有關如何設定此屬性的更多資訊。 |
pattern
屬性的值由格式代碼組成。有些代碼需要額外的字首。可能的字首包括「client」的 c
、「server」的 s
、「client to server」的 cs
、「server to client」的 sc
或「application specific」的 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 - GMT 的 yyyy-mm-dd 格式日期
- s-dns - 本機主機名稱
- s-ip - 本機 IP 位址
- sc-status - 回應的 HTTP 狀態碼
- time - GMT 的 HH:mm:ss 格式服務請求時間
- 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 存取記錄 Valve
簡介
屬性
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
存取控制
遠端位址 Valve
簡介
遠端位址閥門讓您能將提交此要求的用戶端 IP 位址與一個或多個正規表示式進行比對,並允許要求繼續或拒絕處理來自此用戶端的請求。遠端位址閥門可以與任何 Catalina 容器(引擎、主機或內容)關聯,並且必須接受提交到此容器以進行處理的任何請求,才會傳遞該請求。
正規表示式的語法與「標準」萬用字元比對的語法不同。Tomcat 使用 java.util.regex
套件。請參閱 Java 文件以取得支援的表示式的詳細資料。
在將屬性 addConnectorPort
設定為 true
之後,可以附加伺服器連接埠,並以分號 (";") 分隔,以允許每個連接埠有不同的表示式。
透過將屬性 usePeerAddress
設定為 true
,閥門會在其檢查中使用連線對等位址。如果在 Tomcat 前方使用反向代理程式,搭配 AJP 協定或 HTTP 協定加上 RemoteIp(Valve|Filter)
,這將與用戶端 IP 不同。
拒絕的請求將以狀態碼 403
回答回應。可以使用屬性 denyStatus
覆寫此狀態碼。
透過將屬性 invalidAuthenticationWhenDeny
設定為 true
,當請求被拒絕時,行為可以變更為不拒絕,而是設定無效的 驗證
標頭。這與內容屬性 preemptiveAuthentication="true"
結合使用時很有用。
注意:在將此閥門與 IPv6 位址搭配使用時,有一個注意事項。此閥門處理的 IP 位址格式取決於用於取得該位址的 API。如果位址是使用 Java socket 和 Inet6Address 類別取得的,其格式將為 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 |
一個正規表示式(使用 |
deny |
一個正規表示式(使用 |
denyStatus |
拒絕拒絕的要求時使用的 HTTP 回應狀態碼。預設值為 |
addConnectorPort |
將伺服器連接埠新增到客戶端 IP 位址,並以分號 (";") 分隔。如果將此設定為 |
invalidAuthenticationWhenDeny |
當要求應被拒絕時,不要拒絕,而是設定一個無效的 這可以與 |
usePeerAddress |
使用連線對等位址,而不是客戶端 IP 位址。如果在 Tomcat 前面使用反向代理程式,並搭配 AJP 協定或 HTTP 協定加上 |
範例 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
簡介
遠端主機閥允許您將提交此請求的客戶端主機名稱與一個或多個正規表示式進行比較,並允許請求繼續或拒絕處理來自此客戶端的請求。遠端主機閥可以與任何 Catalina 容器 (引擎、主機 或 內容) 關聯,且必須接受提交給此容器進行處理的任何請求,然後才會傳遞請求。
正規表示式的語法與「標準」萬用字元比對的語法不同。Tomcat 使用 java.util.regex
套件。請參閱 Java 文件以取得支援的表示式的詳細資料。
在將屬性 addConnectorPort
設定為 true
之後,可以附加伺服器連接埠,並以分號 (";") 分隔,以允許每個連接埠有不同的表示式。
拒絕的請求將以狀態碼 403
回答回應。可以使用屬性 denyStatus
覆寫此狀態碼。
透過將屬性 invalidAuthenticationWhenDeny
設定為 true
,當請求被拒絕時,行為可以變更為不拒絕,而是設定無效的 驗證
標頭。這與內容屬性 preemptiveAuthentication="true"
結合使用時很有用。
注意:此閥處理由方法 ServletRequest.getRemoteHost()
傳回的值。若要讓方法傳回正確的主機名稱,您必須在 連接器上啟用「DNS 查詢」功能。
屬性
遠端主機閥支援下列設定屬性
屬性 | 說明 |
---|---|
className |
要使用的實作之 Java 類別名稱。這必須設定為 org.apache.catalina.valves.RemoteHostValve。 |
allow |
遠端客戶端主機名稱與之進行比較的正規表示式(使用 |
deny |
遠端客戶端主機名稱與之進行比較的正規表示式(使用 |
denyStatus |
拒絕拒絕的要求時使用的 HTTP 回應狀態碼。預設值為 |
addConnectorPort |
將伺服器連接器埠新增到客戶端主機名稱,並以分號 (";") 分隔。如果將此設定為 |
invalidAuthenticationWhenDeny |
當要求應被拒絕時,不要拒絕,而是設定一個無效的 這可以與 |
遠端 CIDR Valve
簡介
遠端 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
,當請求被拒絕時,行為可以變更為不拒絕,而是設定無效的 驗證
標頭。這與內容屬性 preemptiveAuthentication="true"
結合使用時很有用。
這個閥門的一些其他功能是
- 如果你省略 CIDR 前綴,這個閥門就會變成一個單一 IP 閥門;
- 與 遠端主機閥門 不同,它可以處理濃縮形式的 IPv6 位址(
::1
、fe80::/71
等)。
屬性
遠端 CIDR 閥門 支援下列設定屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.RemoteCIDRValve。 |
allow |
以逗號分隔的 IPv4 或 IPv6 網域遮罩或位址清單,用來比對遠端用戶端 IP 位址。如果指定這個屬性,遠端位址必須符合才能接受這個要求。如果未指定這個屬性,所有要求都會被接受,除非遠端 IP 與 |
deny |
以逗號分隔的 IPv4 或 IPv6 網域遮罩或位址清單,用來比對遠端用戶端 IP 位址。如果指定這個屬性,遠端位址不能符合才能接受這個要求。如果未指定這個屬性,要求接受只會受 |
denyStatus |
拒絕拒絕的要求時使用的 HTTP 回應狀態碼。預設值為 |
addConnectorPort |
將伺服器連接埠新增到客戶端 IP 位址,並以分號 (";") 分隔。如果將此設定為 |
invalidAuthenticationWhenDeny |
當要求應被拒絕時,不要拒絕,而是設定一個無效的 這可以與 |
usePeerAddress |
使用連線對等位址,而不是客戶端 IP 位址。如果在 Tomcat 前面使用反向代理程式,並搭配 AJP 協定或 HTTP 協定加上 |
範例 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,當啟用狀態設定為「已停用」時,它就會執行動作。
您應該注意在 Valve 管線中比任何驗證 Valve 更早註冊此 Valve,因為此 Valve 應該能夠在任何驗證 Valve 將要求儲存到受保護資源之前重新導向要求。如果發生這種情況,將會建立新的會話,而且排空程序會暫停,因為會建立新的有效會話。
屬性
負載平衡器排空 Valve 支援下列設定屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.LoadBalancerDrainingValve。 |
redirectStatusCode |
允許設定自訂重新導向代碼,當客戶端重新導向到由負載平衡器重新平衡時使用。預設值為 307 TEMPORARY_REDIRECT。 |
ignoreCookieName |
與 |
ignoreCookieValue |
與 |
遠端 IP Valve
簡介
Tomcat 埠的 mod_remoteip,此 Valve 會使用透過要求標頭(例如「X-Forwarded-For」)由代理程式或負載平衡器提供的 IP 位址清單取代要求的明顯客戶端遠端 IP 位址和主機名稱。
此 Valve 的另一個功能是使用透過要求標頭(例如「X-Forwarded-Proto」)由代理程式或負載平衡器提供的架構取代明顯的架構(http/https)、伺服器埠和 request.secure
。
此閥門可視需要在引擎
、主機
或內容
層級使用。通常,此閥門會在引擎
層級使用。
如果與遠端地址/主機閥門一起使用,則應先定義此閥門,以確保將正確的用戶端 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 |
代理伺服器的 IP 地址必須符合的正規表示式(使用 |
proxiesHeader |
此閥門建立的 HTTP 標頭名稱,用於儲存已在輸入的remoteIpHeader中處理的代理伺服器清單。如果未指定,則使用預設的 |
已啟用請求屬性 |
設定為 |
trustedProxies |
正規表示式(使用 |
protocolHeader |
此閥值讀取的 HTTP 標頭名稱,其中包含用戶端用於連線到代理伺服器的通訊協定。如果未指定,將使用預設值 |
hostHeader |
此閥值讀取的 HTTP 標頭名稱,其中包含用戶端用於連線到代理伺服器的主機。如果未指定,將使用預設值 |
portHeader |
此閥值讀取的 HTTP 標頭名稱,其中包含用戶端用於連線到代理伺服器的埠。如果未指定,將使用預設值 |
protocolHeaderHttpsValue |
protocolHeader 的值,用於表示這是 HTTPS 要求。如果未指定,將使用預設值 |
httpServerPort |
當 protocolHeader 表示 |
httpsServerPort |
當 protocolHeader 表示 |
changeLocalName |
如果為 |
changeLocalPort |
如果為 |
SSL Valve
簡介
使用 mod_proxy_http 時,用戶端 SSL 資訊不會包含在通訊協定中(與 mod_jk 和 mod_proxy_ajp 不同)。若要讓 Tomcat 使用用戶端 SSL 資訊,需要一些額外的設定。在 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 Valve 支援下列設定屬性
屬性 | 說明 |
---|---|
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 標頭的客製化名稱。如果未指定,則使用預設值 |
單一登入 Valve
簡介
當您希望讓使用者能夠登入與您的虛擬主機相關聯的任何一個 Web 應用程式,然後讓同一個虛擬主機上的所有其他 Web 應用程式辨識其身分時,就會使用單一登入 Valve。
請參閱主機元素上的單一登入特殊功能,以取得更多資訊。
屬性
單一登入 Valve 支援下列設定屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.SingleSignOn。 |
requireReauthentication |
預設為 false。旗標用於判斷是否需要對每個要求重新向安全性領域進行驗證。如果為「true」,此 Valve 會使用快取的安全性憑證(使用者名稱和密碼)對與 SSO 會話相關聯的每個要求重新向領域進行驗證。如果為「false」,Valve 本身可以根據有效的 SSO Cookie 的存在來驗證要求,而無需重新向領域進行驗證。 |
cookieDomain |
設定要使用於 SSO Cookie 的主機網域。 |
cookieName |
設定要使用於 SSO Cookie 的 Cookie 名稱。預設值為 |
驗證
此區段中的 Valve 實作org.apache.catalina.Authenticator 介面。
基本驗證器 Valve
屬性
基本驗證器閥支援下列組態屬性
屬性 | 說明 |
---|---|
allowCorsPreflight |
符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 |
alwaysUseSession |
使用者驗證後是否應始終使用工作階段?由於工作階段可用於快取已驗證的主體,因此這可能會提供一些效能優勢,進而無需在每個請求中透過 Realm 驗證使用者。這可能有助於將 BASIC 驗證與 JNDIRealm 或 DataSourceRealms 搭配使用。不過,建立和 GC 工作階段也會產生效能成本。如果未設定,將使用預設值 |
cache |
如果請求是 HTTP 工作階段的一部分,我們是否應快取已驗證的主體?如果未指定,將使用預設值 |
changeSessionIdOnAuthentication |
控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 |
charset |
控制 |
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.BasicAuthenticator。 |
disableProxyCaching |
控制受安全性約束保護的頁面的快取。將此設定為 |
jaspicCallbackHandlerClass |
|
securePagesWithPragma |
控制受安全性約束保護的頁面的快取。將此設定為 |
secureRandomAlgorithm |
用於建立產生會話 ID 的 |
secureRandomClass |
延伸 |
secureRandomProvider |
用於建立產生 SSO 會話 ID 的 |
sendAuthInfoResponseHeaders |
控制是否將驗證資訊(遠端使用者和驗證類型)傳回作為轉發/代理請求的回應標頭。當 |
trimCredentials |
控制是否移除已剖析憑證的前導和/或尾隨空白。如果未指定,預設值為 注意:此屬性將從 Tomcat 11 起移除。 |
摘要驗證器 Valve
屬性
摘要驗證器閥門支援下列設定屬性
屬性 | 說明 |
---|---|
algorithms |
用於驗證程序的摘要演算法的逗號分隔清單。演算法可以使用 Java 標準名稱或 RFC 7616 使用的名稱來指定。如果未指定,將使用預設值 |
allowCorsPreflight |
符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 |
alwaysUseSession |
使用者驗證後是否應始終使用工作階段?由於工作階段可用於快取已驗證的主體,因此這可能會提供一些效能優勢,進而無需在每個請求中透過 Realm 驗證使用者。這可能有助於將 BASIC 驗證與 JNDIRealm 或 DataSourceRealms 搭配使用。不過,建立和 GC 工作階段也會產生效能成本。如果未設定,將使用預設值 |
cache |
如果請求是 HTTP 會話的一部分,我們是否快取已驗證的主體?如果未指定,將使用預設值 |
changeSessionIdOnAuthentication |
控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 |
className |
要使用的實作的 Java 類別名稱。此項必須設定為 org.apache.catalina.authenticator.DigestAuthenticator。 |
disableProxyCaching |
控制受安全性約束保護的頁面的快取。將此設定為 |
jaspicCallbackHandlerClass |
|
key |
摘要驗證使用的密鑰。如果未設定,將產生安全的隨機值。通常只有在有必要讓金鑰值在伺服器重新啟動和/或叢集之間保持不變時才設定此項。 |
nonceCacheSize |
為了防止重播攻擊,DIGEST 驗證器會追蹤伺服器亂數值和亂數值計數值。此屬性控制該快取的大小。如果未指定,將使用預設值 1000。 |
nonceCountWindowSize |
客戶端請求可能會亂序處理,這反過來表示亂數值計數值可能會亂序處理。為了在亂數值計數亂序呈現時防止驗證失敗,驗證器會追蹤亂數值計數值的視窗。此屬性控制該視窗的大小。如果未指定,將使用預設值 100。 |
nonceValidity |
伺服器產生之 nonce 在驗證中被視為有效的時間(毫秒)。若未指定,預設值為 300000(5 分鐘)。 |
opaque |
摘要驗證所使用的伺服器不透明字串。若未設定,會產生一個隨機值。通常只有在需要讓不透明值在伺服器重新啟動和/或叢集之間保持不變時,才會設定此值。 |
securePagesWithPragma |
控制受安全性約束保護的頁面的快取。將此設定為 |
secureRandomAlgorithm |
用於建立產生會話 ID 的 |
secureRandomClass |
延伸 |
secureRandomProvider |
用於建立產生 SSO 會話 ID 的 |
sendAuthInfoResponseHeaders |
控制是否將驗證資訊(遠端使用者和驗證類型)傳回作為轉發/代理請求的回應標頭。當 |
validateUri |
是否應根據 RFC2617 驗證 URI?若未指定,預設值為 |
表單驗證器 Valve
屬性
表單驗證器閥門支援下列組態屬性
屬性 | 說明 |
---|---|
allowCorsPreflight |
符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 |
authenticationSessionTimeout |
如果驗證程序建立一個工作階段,這是驗證程序中最大的工作階段逾時(以秒為單位)。驗證完成後,將套用預設的工作階段逾時。在驗證程序開始前就存在的會話,其原始會話逾時將持續存在。若未設定,預設值為 |
changeSessionIdOnAuthentication |
控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 |
characterEncoding |
用於從要求中讀取使用者名稱和密碼參數的字元編碼。若未設定,將使用要求主體的編碼。 |
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.FormAuthenticator。 |
disableProxyCaching |
控制受安全性約束保護的頁面的快取。將此設定為 |
jaspicCallbackHandlerClass |
|
landingPage |
控制表單驗證程序在程序被誤用時的行為,例如直接要求登入頁面或延遲登入太久導致會話逾時。如果設定此屬性,Tomcat 會在使用有效憑證提交登入表單時,將使用者重新導向到指定的著陸頁面,而不是傳回錯誤回應碼。若要處理登入,著陸頁面必須是一個受保護的資源(即需要驗證的資源)。如果著陸頁面不需要驗證,則使用者不會登入,並且在他們存取受保護頁面時,會再次提示他們輸入憑證。 |
securePagesWithPragma |
控制受安全性約束保護的頁面的快取。將此設定為 |
secureRandomAlgorithm |
用於建立產生會話 ID 的 |
secureRandomClass |
延伸 |
secureRandomProvider |
用於建立產生 SSO 會話 ID 的 |
sendAuthInfoResponseHeaders |
控制是否將驗證資訊(遠端使用者和驗證類型)傳回作為轉發/代理請求的回應標頭。當 |
SSL 驗證器 Valve
屬性
SSL 驗證器閥支援下列組態屬性
屬性 | 說明 |
---|---|
allowCorsPreflight |
符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 |
cache |
如果請求是 HTTP 工作階段的一部分,我們是否應快取已驗證的主體?如果未指定,將使用預設值 |
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.SSLAuthenticator。 |
changeSessionIdOnAuthentication |
控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 |
disableProxyCaching |
控制受安全性約束保護的頁面的快取。將此設定為 |
jaspicCallbackHandlerClass |
|
securePagesWithPragma |
控制受安全性約束保護的頁面的快取。將此設定為 |
secureRandomAlgorithm |
用於建立產生會話 ID 的 |
secureRandomClass |
延伸 |
secureRandomProvider |
用於建立產生 SSO 會話 ID 的 |
SPNEGO Valve
屬性
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 |
|
loginConfigName |
用於登入服務的 JAAS 登入組態名稱。如果未指定,則使用預設值 |
noKeepAliveUserAgents |
有些客戶端(不是大多數瀏覽器)預期伺服器會快取連線的經過驗證使用者資訊,而且不會在每個請求中重新傳送憑證。除非有 HTTP 階段可用,否則 Tomcat 不會執行此動作。如果應用程式建立階段或為此驗證器啟用了 作為建立工作階段的替代方案,此屬性可用於定義停用 HTTP 保持連線的使用者代理。這表示連線只會用於單一要求,因此無法針對每個連線快取經過驗證的使用者資訊。停用 HTTP 保持連線會造成效能成本。 此屬性應為符合整個使用者代理字串的正規表示法,例如 |
securePagesWithPragma |
控制受安全性約束保護的頁面的快取。將此設定為 |
secureRandomAlgorithm |
用於建立產生會話 ID 的 |
secureRandomClass |
延伸 |
secureRandomProvider |
用於建立產生 SSO 會話 ID 的 |
sendAuthInfoResponseHeaders |
控制是否將驗證資訊(遠端使用者和驗證類型)傳回作為轉發/代理請求的回應標頭。當 |
storeDelegatedCredential |
控制使用者委派憑證是否會儲存在使用者主體中。如果可用,委派憑證會透過 |
錯誤報告 Valve
簡介
錯誤報告閥是一個針對 HTTP 狀態碼的簡單錯誤處理常式,它會產生並傳回 HTML 錯誤頁面。它也可以設定為針對特定狀態碼和/或例外類型傳回預先定義的靜態 HTML 頁面。
注意:同時停用 showServerInfo 和 showReport 只會傳回 HTTP 狀態碼。
屬性
錯誤報告閥支援下列設定屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.ErrorReportValve 才能使用預設的錯誤報告閥。 |
errorCode.nnn |
針對 |
exceptionType.fullyQualifiedClassName |
如果發生錯誤且 |
showReport |
旗標用於判斷在發生錯誤時是否顯示錯誤報告(自訂錯誤訊息和/或堆疊追蹤)。如果設定為 |
showServerInfo |
旗標用於判斷在發生錯誤時是否顯示伺服器資訊。如果設定為 |
Json 錯誤報告 Valve
簡介
**Json 錯誤報告閥門** 是 HTTP 狀態碼的簡單錯誤處理常式,將傳回 Json 錯誤訊息。
透過在 Host
中的 errorReportValveClass
屬性中指定這個類別,它將取代 ErrorReportValve
,並傳回 JSON 回應,而非 HTML。
屬性
**Json 錯誤報告閥門** 支援下列組態屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.JsonErrorReportValve。 |
代理伺服器錯誤報告 Valve
簡介
**Proxy 錯誤報告閥門** 是 HTTP 狀態碼的簡單錯誤處理常式,將重新導向或代理到負責產生錯誤報告的其他位置。
透過在 Host
中的 errorReportValveClass
屬性中指定這個類別,它將取代 ErrorReportValve
,並使用預設屬性值。若要組態屬性,可以在 Host
元素中定義嵌套的閥門。
屬性
**Proxy 錯誤報告閥門** 支援下列組態屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.ProxyErrorReportValve。 |
usePropertiesFile |
如果為 |
useRedirect |
如果為 |
設定
Proxy Error Report Valve 可以使用類別路徑中的資源檔案 ProxyErrorReportValve.properties,其中每個項目為 statusCode=baseUrl。baseUrl 不應包含任何 URL 參數、statusCode、statusDescription、requestUri 和 throwable,這些會自動附加。應使用名為 0
的特殊金鑰,將任何其他未對應的程式碼與重新導向或代理 URL 相符。
爬蟲程式會話管理員 Valve
簡介
網路爬蟲在爬取網站時,可能會觸發建立數千個工作階段,這可能會導致大量記憶體消耗。此閥門可確保爬蟲與單一工作階段相關聯,就像一般使用者一樣,不論他們是否提供工作階段權杖與其要求。
此閥門可視需要在引擎
、主機
或內容
層級使用。通常,此閥門會在引擎
層級使用。
如果與 Remote IP 閥門一起使用,則應在該閥門之前定義 Remote IP 閥門,以確保將正確的用戶端 IP 位址提供給此閥門。
屬性
Crawler Session Manager Valve 支援下列組態屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.CrawlerSessionManagerValve。 |
contextAware |
旗標,用於將內容名稱與用戶端 IP 一起使用,以識別要重新使用的工作階段。可以與 |
crawlerIps |
正規表示式(使用 |
crawlerUserAgents |
正規表示式(使用 |
hostAware |
旗標,用於將組態的伺服器與用戶端 IP 一起使用,以識別要重新使用的工作階段。可以與 |
sessionInactiveInterval |
Crawler Session Manager Valve 應在沒有任何用戶端活動的情況下,將用戶端 IP 對應至記憶體中的工作階段 ID 的最小時間(以秒為單位)。用戶端 IP/工作階段快取會定期清除已閒置超過此區間的對應。如果未指定,將使用預設值 |
卡住執行緒偵測 Valve
簡介
此 Valve 可偵測處理時間過長的請求,這可能表示處理該請求的執行緒已卡住。此外,它可以選擇中斷此類執行緒,嘗試解除其封鎖。
偵測到此類請求時,其執行緒的目前堆疊追蹤會以 WARN 層級寫入 Tomcat 日誌。
卡住執行緒的 ID 和名稱可透過 JMX 取得,方法是使用 stuckThreadIds
和 stuckThreadNames
屬性。這些 ID 可搭配標準 Threading JVM MBean (java.lang:type=Threading
) 使用,以取得關於每個卡住執行緒的其他資訊。
屬性
卡住執行緒偵測 Valve 支援下列組態屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.StuckThreadDetectionValve。 |
threshold |
執行緒被視為卡住的最小持續時間(以秒為單位)。預設為 600 秒。如果設定為 0,則會停用偵測功能。 注意:由於偵測(和選擇性中斷)是在宣告此 Valve 的容器(引擎、主機或內容)的背景執行緒中執行,因此閾值應高於此容器的 |
interruptThreadThreshold |
卡住執行緒應中斷以嘗試「釋放」它的最小持續時間(以秒為單位)。 請注意,無法保證執行緒會解除卡住。這通常適用於卡在 I/O 或鎖定的執行緒,但對於無限迴圈來說可能沒有用。 預設為 -1,這會停用此功能。若要啟用此功能,值必須大於或等於 |
Semaphore Valve
簡介
Semaphore Valve 能夠限制同時處理請求的執行緒數目。
org.apache.catalina.valves.SemaphoreValve 提供子類別可以覆寫的方法,以自訂行為
- 可以覆寫
controlConcurrency
以新增條件; - 當不授予許可時,可以覆寫
permitDenied
以新增錯誤處理。
屬性
Semaphore Valve 支援下列組態屬性
屬性 | 說明 |
---|---|
block |
旗標用於判斷是否在許可證可用前封鎖執行緒。預設值為true。 |
className |
要使用的實作的 Java 類別名稱。這必須設定為org.apache.catalina.valves.SemaphoreValve。 |
concurrency |
Semaphore 的並行處理層級。預設值為10。 |
fairness |
Semaphore 的公平性。預設值為false。 |
highConcurrencyStatus |
如果無法從 sepmaphore 取得許可證,則會傳回給用戶端錯誤狀態碼(如果值為正數)。預設值為-1,表示不會傳回錯誤狀態。 |
interruptible |
旗標用於判斷是否在許可證可用前中斷執行緒。預設值為false。 |
健康檢查 Valve
簡介
Health Check Valve 會回應雲端協調器的健康檢查。
屬性
Health Check Valve 支援下列組態屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為org.apache.catalina.valves.HealthCheckValve。 |
path |
雲端協調器健康檢查邏輯的路徑。如果 valve 與內容相關聯,則這會相對於內容路徑。否則,valve 會比對完整的 URI。預設值為/health。 |
checkContainersAvailable |
如果為 |
持續性 Valve
簡介
實作每個要求階段持續性的PersistentValve。目的是與非黏著負載平衡器一起使用。
屬性
PersistentValve Valve 支援下列組態屬性
屬性 | 說明 |
---|---|
className |
要使用的實作的 Java 類別名稱。這必須設定為org.apache.catalina.valves.PersistentValve。 |
filter |
對於已知的檔案副檔名或網址,您可以使用此篩選器模式通知 valve 在此要求期間不需要階段。如果要求符合此篩選器模式,valve 會假設不需要復原階段。範例篩選器會類似於 |
semaphoreAcquireUninterruptibly |
旗標用於判斷是否在等待每個階段的 Semaphore 時封鎖執行緒,且執行緒應不中斷。如果 semaphoreBlockOnAcquire 為 |
semaphoreBlockOnAcquire |
旗標用於判斷是否在另一個執行緒持有每個階段的 Semaphore 時,希望取得該 Semaphore 的執行緒應封鎖,直到它可以取得 Semaphore,或是否應拒絕等待要求。如果未指定,則會使用預設值 |
semaphoreFairness |
旗標用於判斷每個階段的 Semaphore 是否會依序授予 Semaphore 要求。如果 semaphoreBlockOnAcquire 為 |