Valve 組件

目錄

簡介

Valve 元素代表將插入關聯的 Catalina 容器 (引擎主機內容) 的請求處理管線中的組件。個別 Valve 具有不同的處理功能,並在下方個別說明。

以下說明使用變數名稱 $CATALINA_BASE 來指大部分相對路徑解析的基礎目錄。如果您尚未透過設定 CATALINA_BASE 目錄來設定 Tomcat 的多個執行個體,則 $CATALINA_BASE 會設定為 $CATALINA_HOME 的值,也就是您安裝 Tomcat 的目錄。

存取記錄

存取記錄是由實作 org.apache.catalina.AccessLog 介面的 Valve 執行的。

存取記錄 Valve

簡介

存取記錄閥會以與標準網路伺服器相同的格式建立記錄檔。這些記錄檔之後可由標準記錄檔分析工具分析,以追蹤頁面點閱次數、使用者會話活動等。此使用獨立的邏輯來寫入其記錄檔,這些記錄檔每天可在午夜自動輪替。(存取記錄的基本需求是處理大量連續資料串流,且負載低。此不使用 Apache Commons Logging,因此可避免額外的負載和潛在複雜的組態)。

可以與任何 Catalina 容器(ContextHostEngine)關聯,並會記錄由該容器處理的所有要求。

有些要求可能會在傳遞給容器之前由 Tomcat 處理。這些要求包括從 /foo 到 /foo/ 的重新導向,以及拒絕無效的要求。在 Tomcat 可以識別會處理要求的Context時,要求/回應會記錄在關聯的ContextHostEngineAccessLog中。在 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() 不為 null 時才會記錄要求。例如,如果此值設定為 important,則只有在 ServletRequest.getAttribute("important") != null 時才會記錄特定要求。使用 Filter 是在許多不同要求中設定/取消設定 ServletRequest 中屬性的簡易方法。

conditionUnless

開啟條件記錄。如果設定,只有在 ServletRequest.getAttribute() 為 null 時才會記錄要求。例如,如果此值設定為 junk,則只有在 ServletRequest.getAttribute("junk") == null 時才會記錄特定要求。使用 Filter 是在許多不同要求中設定/取消設定 ServletRequest 中屬性的簡易方法。

directory

此閥門建立的日誌檔所放置的目錄的絕對或相對路徑。如果指定相對路徑,它會被解釋為相對於 $CATALINA_BASE。如果未指定目錄屬性,預設值為「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:10:0:0:0:0:0:0:1)。預設值:false

locale

用於在存取記錄行中格式化時間戳記的地區設定。使用明確的 SimpleDateFormat 模式(%{xxx}t)設定的任何時間戳記都會在此地區設定中格式化。預設會使用 Java 程序的預設地區設定。不支援在 AccessLogValve 初始化後切換地區設定。使用一般記錄格式(CLF)的任何時間戳記都會在 en_US 地區設定中格式化。

maxDays

輪替存取記錄所保留的最大天數,超過後會刪除。如果未指定,會使用預設值 -1,表示永遠不刪除舊檔案。

maxLogMessageBufferSize

記錄訊息緩衝區通常會回收再利用。為避免過度使用記憶體,如果緩衝區成長超過此大小,它將會被捨棄。預設值為 256 個字元。這應該設定為大於一般存取記錄訊息的大小。

樣式

一個格式化配置,用於識別要記錄的請求和回應的各種資訊欄位,或字詞 commoncombined 以選擇標準格式。請參閱下方以取得更多有關如何設定此屬性的資訊。

前置字元

新增至每個記錄檔名稱開頭的前置字元。如果未指定,預設值為「access_log」。

旋轉時重新命名

對於可旋轉記錄檔,預設值是活動存取記錄檔名稱會包含 fileDateFormat 中的目前時間戳記。在旋轉期間,檔案會關閉,並建立一個名稱中具有下一個時間戳記的新檔案並使用。將 renameOnRotate 設定為 true 時,時間戳記不再是活動記錄檔名稱的一部分。只有在旋轉期間,檔案才會關閉,然後重新命名以包含時間戳記。這類似於大多數記錄架構在執行基於時間的旋轉時的行為。預設值:false

已啟用請求屬性

設定為 true 以檢查請求屬性的存在(通常由 RemoteIpValve 和類似元件設定),這些屬性應使用來覆寫請求傳回的遠端位址、遠端主機、伺服器埠和通訊協定的值。如果未設定屬性,或此屬性設定為 false,則會使用請求中的值。如果未設定,將使用 false 的預設值。

解析主機

此屬性不再受支援。請改用連接器屬性 enableLookups

如果連接器上的 enableLookups 已設定為 true,且您想要忽略它,請在 pattern 的值中使用 %a,而不是 %h

可旋轉

旗標用於判斷是否應執行記錄旋轉。如果設定為 false,則此檔案絕不會旋轉,且會忽略 fileDateFormat。預設值:true

後置字元

新增至每個記錄檔名稱結尾的後置字元。如果未指定,預設值為「」(零長度字串),表示不會新增後置字元。

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"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,才能使用延伸的存取記錄閥門。

樣式

格式化配置,識別要記錄的請求和回應的各種資訊欄位。請參閱下方,以取得有關如何設定此屬性的更多資訊。

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): 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 存取記錄 Valve

簡介

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

存取控制

遠端位址 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

一個正規表示式(使用 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

簡介

遠端主機閥允許您將提交此請求的客戶端主機名稱與一個或多個正規表示式進行比較,並允許請求繼續或拒絕處理來自此客戶端的請求。遠端主機閥可以與任何 Catalina 容器 (引擎主機內容) 關聯,且必須接受提交給此容器進行處理的任何請求,然後才會傳遞請求。

正規表示式的語法與「標準」萬用字元比對的語法不同。Tomcat 使用 java.util.regex 套件。請參閱 Java 文件以取得支援的表示式的詳細資料。

在將屬性 addConnectorPort 設定為 true 之後,可以附加伺服器連接埠,並以分號 (";") 分隔,以允許每個連接埠有不同的表示式。

拒絕的請求將以狀態碼 403 回答回應。可以使用屬性 denyStatus 覆寫此狀態碼。

透過將屬性 invalidAuthenticationWhenDeny 設定為 true,當請求被拒絕時,行為可以變更為不拒絕,而是設定無效的 驗證 標頭。這與內容屬性 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 Valve

簡介

遠端 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,當請求被拒絕時,行為可以變更為不拒絕,而是設定無效的 驗證 標頭。這與內容屬性 preemptiveAuthentication="true" 結合使用時很有用。

這個閥門的一些其他功能是

  • 如果你省略 CIDR 前綴,這個閥門就會變成一個單一 IP 閥門;
  • 遠端主機閥門 不同,它可以處理濃縮形式的 IPv6 位址(::1fe80::/71 等)。

另請參閱:遠端位址閥門遠端主機閥門遠端 IP 閥門HTTP 連接器 設定。

屬性

遠端 CIDR 閥門 支援下列設定屬性

屬性 說明
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,當啟用狀態設定為「已停用」時,它就會執行動作。

您應該注意在 Valve 管線中比任何驗證 Valve 更早註冊此 Valve,因為此 Valve 應該能夠在任何驗證 Valve 將要求儲存到受保護資源之前重新導向要求。如果發生這種情況,將會建立新的會話,而且排空程序會暫停,因為會建立新的有效會話。

屬性

負載平衡器排空 Valve 支援下列設定屬性

屬性 說明
className

要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.LoadBalancerDrainingValve

redirectStatusCode

允許設定自訂重新導向代碼,當客戶端重新導向到由負載平衡器重新平衡時使用。預設值為 307 TEMPORARY_REDIRECT。

ignoreCookieName

ignoreCookieValue 一起使用時,客戶端可以提供這個 Cookie(和隨附的值),這將導致此 Valve 不執行任何動作。這將允許您在重新啟用 已停用 節點之前探查它,以確保它運作正常。

ignoreCookieValue

ignoreCookieName 一起使用時,客戶端可以提供一個 Cookie(和隨附的值),這將導致此 Valve 不執行任何動作。這將允許您在重新啟用 已停用 節點之前探查它,以確保它運作正常。

遠端 IP Valve

簡介

Tomcat 埠的 mod_remoteip,此 Valve 會使用透過要求標頭(例如「X-Forwarded-For」)由代理程式或負載平衡器提供的 IP 位址清單取代要求的明顯客戶端遠端 IP 位址和主機名稱。

此 Valve 的另一個功能是使用透過要求標頭(例如「X-Forwarded-Proto」)由代理程式或負載平衡器提供的架構取代明顯的架構(http/https)、伺服器埠和 request.secure

此閥門可視需要在引擎主機內容層級使用。通常,此閥門會在引擎層級使用。

如果與遠端地址/主機閥門一起使用,則應先定義此閥門,以確保將正確的用戶端 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

代理伺服器的 IP 地址必須符合的正規表示式(使用java.util.regex),才能被視為內部代理伺服器。出現在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

已啟用請求屬性

設定為 true 以設定 AccessLog 實作所使用的要求屬性,用於覆寫要求傳回的遠端位址、遠端主機、伺服器埠和通訊協定的值。要求屬性也用於啟用在 Manager 網路應用程式的狀態頁面上顯示轉送的遠端位址。如果未設定,將使用預設值 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 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 標頭的客製化名稱。如果未指定,則使用預設值 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

請參閱主機元素上的單一登入特殊功能,以取得更多資訊。

屬性

單一登入 Valve 支援下列設定屬性

屬性 說明
className

要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.SingleSignOn

requireReauthentication

預設為 false。旗標用於判斷是否需要對每個要求重新向安全性領域進行驗證。如果為「true」,此 Valve 會使用快取的安全性憑證(使用者名稱和密碼)對與 SSO 會話相關聯的每個要求重新向領域進行驗證。如果為「false」,Valve 本身可以根據有效的 SSO Cookie 的存在來驗證要求,而無需重新向領域進行驗證。

cookieDomain

設定要使用於 SSO Cookie 的主機網域。

cookieName

設定要使用於 SSO Cookie 的 Cookie 名稱。預設值為 JSESSIONIDSSO

驗證

此區段中的 Valve 實作org.apache.catalina.Authenticator 介面。

基本驗證器 Valve

簡介

基本驗證器 Valve 會自動新增至任何設定為使用 BASIC 驗證的內容

如果需要任何非預設設定,則可以在內容元素中設定 Valve,並使用所需的值。

屬性

基本驗證器閥支援下列組態屬性

屬性 說明
allowCorsPreflight

符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 neverfilteralwaysnever 表示請求絕不會繞過驗證,即使看似 CORS 預先驗證請求。filter 表示如果請求看似 CORS 預先驗證請求,就會繞過驗證;它會對應到已啟用 CORS 篩選器 的網路應用程式;而 CORS 篩選器會對應到 /*always 表示所有看似 CORS 預先驗證請求的請求都會繞過驗證。如果未設定,預設值為 never

alwaysUseSession

使用者驗證後是否應始終使用工作階段?由於工作階段可用於快取已驗證的主體,因此這可能會提供一些效能優勢,進而無需在每個請求中透過 Realm 驗證使用者。這可能有助於將 BASIC 驗證與 JNDIRealm 或 DataSourceRealms 搭配使用。不過,建立和 GC 工作階段也會產生效能成本。如果未設定,將使用預設值 false

cache

如果請求是 HTTP 工作階段的一部分,我們是否應快取已驗證的主體?如果未指定,將使用預設值 true

changeSessionIdOnAuthentication

控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 true

charset

控制 WWW-Authenticate HTTP 標頭是否包含 charset 驗證參數,依據 RFC 7617。唯一允許的選項為 null、空字串和 UTF-8。如果指定 UTF-8charset 驗證參數將會傳送該值,而且提供的使用者名稱和選用密碼將會使用 UTF-8 從位元組轉換為字元。否則,不會傳送 charset 驗證參數,而且提供的使用者名稱和選用密碼將會使用 ISO-8859-1 從位元組轉換為字元。預設值為 null

className

要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.BasicAuthenticator

disableProxyCaching

控制受安全性約束保護的頁面的快取。將此設定為 false 可能有助於解決某些瀏覽器的快取問題,但也會導致受保護的頁面被代理快取,這幾乎肯定會是一個安全性問題。securePagesWithPragma 提供了一個瀏覽器快取問題的替代安全解決方法。如果未設定,將使用預設值 true

jaspicCallbackHandlerClass

javax.security.auth.callback.CallbackHandler 實作的 Java 類別名稱,應由 JASPIC 使用。如果未指定,將使用預設的 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 的 Java 類別名稱,用於產生 SSO 會話 ID。如果未指定,預設值為 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 起移除。

摘要驗證器 Valve

簡介

摘要驗證器閥門會自動新增到任何設定為使用 DIGEST 驗證的 內容

如果需要任何非預設設定,則可以在內容元素中設定 Valve,並使用所需的值。

屬性

摘要驗證器閥門支援下列設定屬性

屬性 說明
algorithms

用於驗證程序的摘要演算法的逗號分隔清單。演算法可以使用 Java 標準名稱或 RFC 7616 使用的名稱來指定。如果未指定,將使用預設值 SHA-256,MD5

allowCorsPreflight

符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 neverfilteralwaysnever 表示請求絕不會繞過驗證,即使看似 CORS 預先驗證請求。filter 表示如果請求看似 CORS 預先驗證請求,就會繞過驗證;它會對應到已啟用 CORS 篩選器 的網路應用程式;而 CORS 篩選器會對應到 /*always 表示所有看似 CORS 預先驗證請求的請求都會繞過驗證。如果未設定,預設值為 never

alwaysUseSession

使用者驗證後是否應始終使用工作階段?由於工作階段可用於快取已驗證的主體,因此這可能會提供一些效能優勢,進而無需在每個請求中透過 Realm 驗證使用者。這可能有助於將 BASIC 驗證與 JNDIRealm 或 DataSourceRealms 搭配使用。不過,建立和 GC 工作階段也會產生效能成本。如果未設定,將使用預設值 false

cache

如果請求是 HTTP 會話的一部分,我們是否快取已驗證的主體?如果未指定,將使用預設值 false

changeSessionIdOnAuthentication

控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 true

className

要使用的實作的 Java 類別名稱。此項必須設定為 org.apache.catalina.authenticator.DigestAuthenticator

disableProxyCaching

控制受安全性約束保護的頁面的快取。將此設定為 false 可能有助於解決某些瀏覽器的快取問題,但也會導致受保護的頁面被代理快取,這幾乎肯定會是一個安全性問題。securePagesWithPragma 提供了一個瀏覽器快取問題的替代安全解決方法。如果未設定,將使用預設值 true

jaspicCallbackHandlerClass

javax.security.auth.callback.CallbackHandler 實作的 Java 類別名稱,應由 JASPIC 使用。如果未指定,將使用預設的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

key

摘要驗證使用的密鑰。如果未設定,將產生安全的隨機值。通常只有在有必要讓金鑰值在伺服器重新啟動和/或叢集之間保持不變時才設定此項。

nonceCacheSize

為了防止重播攻擊,DIGEST 驗證器會追蹤伺服器亂數值和亂數值計數值。此屬性控制該快取的大小。如果未指定,將使用預設值 1000。

nonceCountWindowSize

客戶端請求可能會亂序處理,這反過來表示亂數值計數值可能會亂序處理。為了在亂數值計數亂序呈現時防止驗證失敗,驗證器會追蹤亂數值計數值的視窗。此屬性控制該視窗的大小。如果未指定,將使用預設值 100。

nonceValidity

伺服器產生之 nonce 在驗證中被視為有效的時間(毫秒)。若未指定,預設值為 300000(5 分鐘)。

opaque

摘要驗證所使用的伺服器不透明字串。若未設定,會產生一個隨機值。通常只有在需要讓不透明值在伺服器重新啟動和/或叢集之間保持不變時,才會設定此值。

securePagesWithPragma

控制受安全性約束保護的頁面的快取。將此設定為 false 可能有助於解決某些瀏覽器的快取問題,方法是使用 Cache-Control: private 而不是預設的 Pragma: No-cacheCache-control: No-cache。如果未設定,將使用預設值 false

secureRandomAlgorithm

用於建立產生會話 ID 的 java.security.SecureRandom 執行個體的演算法名稱。如果指定無效的演算法和/或提供者,將使用平台預設提供者和預設演算法。如果未指定,將使用 SHA1PRNG 的預設演算法。如果預設演算法不受支援,將使用平台預設。若要指定應使用平台預設,請勿設定 secureRandomProvider 屬性,並將此屬性設定為空字串。

secureRandomClass

延伸 java.security.SecureRandom 的 Java 類別名稱,用於產生 SSO 會話 ID。如果未指定,預設值為 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

簡介

表單驗證器閥門會自動新增到任何設定為使用表單驗證的 內容

如果需要任何非預設設定,則可以在內容元素中設定 Valve,並使用所需的值。

屬性

表單驗證器閥門支援下列組態屬性

屬性 說明
allowCorsPreflight

符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 neverfilteralwaysnever 表示請求絕不會繞過驗證,即使看似 CORS 預先驗證請求。filter 表示如果請求看似 CORS 預先驗證請求,就會繞過驗證;它會對應到已啟用 CORS 篩選器 的網路應用程式;而 CORS 篩選器會對應到 /*always 表示所有看似 CORS 預先驗證請求的請求都會繞過驗證。如果未設定,預設值為 never

authenticationSessionTimeout

如果驗證程序建立一個工作階段,這是驗證程序中最大的工作階段逾時(以秒為單位)。驗證完成後,將套用預設的工作階段逾時。在驗證程序開始前就存在的會話,其原始會話逾時將持續存在。若未設定,預設值為 120 秒。

changeSessionIdOnAuthentication

控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 true

characterEncoding

用於從要求中讀取使用者名稱和密碼參數的字元編碼。若未設定,將使用要求主體的編碼。

className

要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.FormAuthenticator

disableProxyCaching

控制受安全性約束保護的頁面的快取。將此設定為 false 可能有助於解決某些瀏覽器的快取問題,但也會導致受保護的頁面被代理快取,這幾乎肯定會是一個安全性問題。securePagesWithPragma 提供了一個瀏覽器快取問題的替代安全解決方法。如果未設定,將使用預設值 true

jaspicCallbackHandlerClass

javax.security.auth.callback.CallbackHandler 實作的 Java 類別名稱,應由 JASPIC 使用。如果未指定,將使用預設的 org.apache.catalina.authenticator.jaspic.CallbackHandlerImpl

landingPage

控制表單驗證程序在程序被誤用時的行為,例如直接要求登入頁面或延遲登入太久導致會話逾時。如果設定此屬性,Tomcat 會在使用有效憑證提交登入表單時,將使用者重新導向到指定的著陸頁面,而不是傳回錯誤回應碼。若要處理登入,著陸頁面必須是一個受保護的資源(即需要驗證的資源)。如果著陸頁面不需要驗證,則使用者不會登入,並且在他們存取受保護頁面時,會再次提示他們輸入憑證。

securePagesWithPragma

控制受安全性約束保護的頁面的快取。將此設定為 false 可能有助於解決某些瀏覽器的快取問題,方法是使用 Cache-Control: private 而不是預設的 Pragma: No-cacheCache-control: No-cache。如果未設定,將使用預設值 false

secureRandomAlgorithm

用於建立產生會話 ID 的 java.security.SecureRandom 執行個體的演算法名稱。如果指定無效的演算法和/或提供者,將使用平台預設提供者和預設演算法。如果未指定,將使用 SHA1PRNG 的預設演算法。如果預設演算法不受支援,將使用平台預設。若要指定應使用平台預設,請勿設定 secureRandomProvider 屬性,並將此屬性設定為空字串。

secureRandomClass

延伸 java.security.SecureRandom 的 Java 類別名稱,用於產生 SSO 會話 ID。如果未指定,預設值為 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 驗證器閥門會自動新增到任何設定為使用 SSL 驗證的 內容

如果需要任何非預設設定,則可以在內容元素中設定 Valve,並使用所需的值。

屬性

SSL 驗證器閥支援下列組態屬性

屬性 說明
allowCorsPreflight

符合 CORS 規範要求,允許看似 CORS 預先驗證要求的請求繞過驗證器。允許的值為 neverfilteralwaysnever 表示請求絕不會繞過驗證,即使看似 CORS 預先驗證請求。filter 表示如果請求看似 CORS 預先驗證請求,就會繞過驗證;它會對應到已啟用 CORS 篩選器 的網路應用程式;而 CORS 篩選器會對應到 /*always 表示所有看似 CORS 預先驗證請求的請求都會繞過驗證。如果未設定,預設值為 never

cache

如果請求是 HTTP 工作階段的一部分,我們是否應快取已驗證的主體?如果未指定,將使用預設值 true

className

要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.authenticator.SSLAuthenticator

changeSessionIdOnAuthentication

控制在使用者驗證時,如果工作階段存在,是否變更工作階段 ID。這是為了防止工作階段固定攻擊。如果未設定,將使用預設值 true

disableProxyCaching

控制受安全性約束保護的頁面的快取。將此設定為 false 可能有助於解決某些瀏覽器的快取問題,但也會導致受保護的頁面被代理快取,這幾乎肯定會是一個安全性問題。securePagesWithPragma 提供了一個瀏覽器快取問題的替代安全解決方法。如果未設定,將使用預設值 true

jaspicCallbackHandlerClass

javax.security.auth.callback.CallbackHandler 實作的 Java 類別名稱,應由 JASPIC 使用。如果未指定,將使用預設的 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 的 Java 類別名稱,用於產生 SSO 會話 ID。如果未指定,預設值為 java.security.SecureRandom

secureRandomProvider

用於建立產生 SSO 會話 ID 的 java.security.SecureRandom 執行個體的提供者名稱。如果指定無效的演算法和/或提供者,將使用平台預設提供者和預設演算法。如果未指定,將使用平台預設提供者。

SPNEGO Valve

簡介

SPNEGO 驗證器閥會自動新增到任何組態為使用 SPNEGO 驗證的 Context

如果需要任何非預設設定,則可以在內容元素中設定 Valve,並使用所需的值。

屬性

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

javax.security.auth.callback.CallbackHandler 實作的 Java 類別名稱,應由 JASPIC 使用。如果未指定,將使用預設的 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 的 Java 類別名稱,用於產生 SSO 會話 ID。如果未指定,預設值為 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

簡介

錯誤報告閥是一個針對 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 錯誤報告 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

如果為 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

簡介

網路爬蟲在爬取網站時,可能會觸發建立數千個工作階段,這可能會導致大量記憶體消耗。此閥門可確保爬蟲與單一工作階段相關聯,就像一般使用者一樣,不論他們是否提供工作階段權杖與其要求。

此閥門可視需要在引擎主機內容層級使用。通常,此閥門會在引擎層級使用。

如果與 Remote IP 閥門一起使用,則應在該閥門之前定義 Remote IP 閥門,以確保將正確的用戶端 IP 位址提供給此閥門。

屬性

Crawler Session Manager Valve 支援下列組態屬性

屬性 說明
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

卡住執行緒偵測 Valve

簡介

此 Valve 可偵測處理時間過長的請求,這可能表示處理該請求的執行緒已卡住。此外,它可以選擇中斷此類執行緒,嘗試解除其封鎖。

偵測到此類請求時,其執行緒的目前堆疊追蹤會以 WARN 層級寫入 Tomcat 日誌。

卡住執行緒的 ID 和名稱可透過 JMX 取得,方法是使用 stuckThreadIdsstuckThreadNames 屬性。這些 ID 可搭配標準 Threading JVM MBean (java.lang:type=Threading) 使用,以取得關於每個卡住執行緒的其他資訊。

屬性

卡住執行緒偵測 Valve 支援下列組態屬性

屬性 說明
className

要使用的實作的 Java 類別名稱。這必須設定為 org.apache.catalina.valves.StuckThreadDetectionValve

threshold

執行緒被視為卡住的最小持續時間(以秒為單位)。預設為 600 秒。如果設定為 0,則會停用偵測功能。

注意:由於偵測(和選擇性中斷)是在宣告此 Valve 的容器(引擎、主機或內容)的背景執行緒中執行,因此閾值應高於此容器的 backgroundProcessorDelay

interruptThreadThreshold

卡住執行緒應中斷以嘗試「釋放」它的最小持續時間(以秒為單位)。

請注意,無法保證執行緒會解除卡住。這通常適用於卡在 I/O 或鎖定的執行緒,但對於無限迴圈來說可能沒有用。

預設為 -1,這會停用此功能。若要啟用此功能,值必須大於或等於 threshold

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

如果為 true,valve 會檢查其相關聯的容器及其所有子容器是否可用。預設值為true

持續性 Valve

簡介

實作每個要求階段持續性的PersistentValve。目的是與非黏著負載平衡器一起使用。

屬性

PersistentValve Valve 支援下列組態屬性

屬性 說明
className

要使用的實作的 Java 類別名稱。這必須設定為org.apache.catalina.valves.PersistentValve

filter

對於已知的檔案副檔名或網址,您可以使用此篩選器模式通知 valve 在此要求期間不需要階段。如果要求符合此篩選器模式,valve 會假設不需要復原階段。範例篩選器會類似於 filter=".*\.gif|.*\.js|.*\.jpeg|.*\.jpg|.*\.png|.*\.htm|.*\.html|.*\.css|.*\.txt"。篩選器是使用 java.util.regex 的正規表示式。

semaphoreAcquireUninterruptibly

旗標用於判斷是否在等待每個階段的 Semaphore 時封鎖執行緒,且執行緒應不中斷。如果 semaphoreBlockOnAcquirefalse,則不會產生影響。如果未指定,則會使用預設值 true

semaphoreBlockOnAcquire

旗標用於判斷是否在另一個執行緒持有每個階段的 Semaphore 時,希望取得該 Semaphore 的執行緒應封鎖,直到它可以取得 Semaphore,或是否應拒絕等待要求。如果未指定,則會使用預設值 true

semaphoreFairness

旗標用於判斷每個階段的 Semaphore 是否會依序授予 Semaphore 要求。如果 semaphoreBlockOnAcquirefalse,則不會產生影響。如果未指定,則會使用預設值 true