Context 容器

目錄

簡介

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

Context 元素代表一個網路應用程式,會在特定虛擬主機中執行。每個網路應用程式都基於網路應用程式封存檔 (WAR) 檔案,或包含對應解壓縮內容的目錄,如 Servlet 規格書 (版本 2.2 或更新版本) 中所述。如需網路應用程式封存檔的更多資訊,您可以下載 Servlet 規格書,並檢閱 Tomcat 應用程式開發人員指南

Catalina 會根據將最長可能的 Request URI 前綴與每個已定義 Context 的context 路徑進行比對,來選擇用於處理每個 HTTP 要求的網路應用程式。選取後,該 Context 會根據網路應用程式部署所定義的 servlet 對應,選擇適當的 servlet 來處理傳入的請求。

您可以定義任意數量的 Context 元素。每個此類 Context 在虛擬主機中都必須有唯一的 context 名稱。context 路徑不需要是唯一的 (請參閱以下的平行部署)。此外,必須存在 context 路徑等於零長度字串的 Context。此 Context 會成為此虛擬主機的預設網路應用程式,並用於處理與任何其他 Context 的 context 路徑不匹配的所有請求。

平行部署

您可以同時部署多個具有相同內容路徑的 Web 應用程式版本。用於將要求與內容版本配對的規則如下

  • 如果要求中沒有任何階段資訊,請使用最新版本。
  • 如果要求中存在階段資訊,請檢查每個版本的階段管理員是否有相符的階段,如果找到,請使用該版本。
  • 如果要求中存在階段資訊,但找不到相符的階段,請使用最新版本。

主機可以透過 (undeployOldVersions) 設定,以便在不再使用時移除以這種方式部署的舊版本。

命名

當主機執行autoDeploydeployOnStartup操作時,Web 應用程式的名稱和內容路徑會從定義 Web 應用程式的檔案名稱中衍生。因此,內容路徑可能不會定義在嵌入應用程式中的META-INF/context.xml中,並且內容名稱內容路徑內容版本基本檔案名稱(名稱減去任何.war.xml副檔名)之間有密切關係。

如果未指定版本,則內容名稱始終與內容路徑相同。如果內容路徑為空字串,則基本名稱將為 ROOT(始終為大寫),否則基本名稱將為內容路徑,移除開頭的 '/' 並將任何剩餘的 '/' 字元替換為 '#'

如果指定了版本,則內容路徑保持不變,而內容名稱基本名稱都會附加字串 '##',後接版本識別碼。

以下提供這些命名慣例的一些範例。

內容路徑 內容版本 內容名稱 基本檔案名稱 範例檔案名稱 (.xml、.war 和目錄)
/foo /foo foo foo.xml、foo.war、foo
/foo/bar /foo/bar foo#bar foo#bar.xml、foo#bar.war、foo#bar
空字串 空字串 ROOT ROOT.xml、ROOT.war、ROOT
/foo 42 /foo##42 foo##42 foo##42.xml、foo##42.war、foo##42
/foo/bar 42 /foo/bar##42 foo#bar##42 foo#bar##42.xml、foo#bar##42.war、foo#bar##42
空字串 42 ##42 ROOT##42 ROOT##42.xml、ROOT##42.war、ROOT##42

版本元件被視為字串,原因出於效能考量,並允許在版本控制架構中具備彈性。字串比較用於判斷版本順序。如果未指定版本,則會將其視為空字串。因此,foo.war將被視為早於foo##11.war的版本,而foo##11.war將被視為早於foo##2.war的版本。如果使用純數字版本控制架構,建議使用零填充,以便foo##002.war被視為早於foo##011.war的版本。

如果您想要部署一個 WAR 檔案或一個目錄,並使用一個與基本檔案名稱無關的內容路徑,那麼必須使用下列選項之一來防止重複部署

  • 停用 autoDeploy 和 deployOnStartup,並在 server.xml 中定義所有 Context
  • 將 WAR 和/或目錄定位在 Host 的 appBase 之外,並使用具有 docBase 屬性的 context.xml 檔案來定義它。

定義 Context

不建議將 <Context> 元素直接放置在 server.xml 檔案中。這是因為它會使修改 Context 組態更具侵入性,因為無法在不重新啟動 Tomcat 的情況下重新載入主要的 conf/server.xml 檔案。預設的 Context 元素(請參閱下方)也會覆寫直接放置在 server.xml 中的任何 <Context> 元素的組態。為防止發生這種情況,在 server.xml 中定義的 <Context> 元素的 override 屬性應設定為 true

可以明確定義個別的 Context 元素

  • 在應用程式檔案內的 /META-INF/context.xml 中的個別檔案中。根據 Host 的 copyXML 屬性,可以選擇性地將其複製到 $CATALINA_BASE/conf/[enginename]/[hostname]/,並重新命名為應用程式的基本檔案名稱加上「.xml」副檔名。
  • $CATALINA_BASE/conf/[enginename]/[hostname]/ 目錄中的個別檔案(具有「.xml」副檔名)中。內容路徑和版本將從檔案的基本名稱(檔案名稱減去 .xml 副檔名)中派生。此檔案將永遠優先於封裝在 Web 應用程式 META-INF 目錄中的任何 context.xml 檔案。
  • 在主要 conf/server.xml 中的 Host 元素內。

可以定義套用至多個 Web 應用程式的預設 Context 元素。個別 Web 應用程式的組態將會覆寫在這些預設值之一中組態的任何內容。在預設 Context 中定義的任何巢狀元素(例如 <Resource> 元素)將會針對預設值套用的每個 Context 建立一次。它們不會Context 元素之間共用。

  • $CATALINA_BASE/conf/context.xml 檔案中:所有 Web 應用程式都將載入 Context 元素資訊。
  • $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default 檔案中:該主機的所有 Web 應用程式都將載入 Context 元素資訊。

除了 server.xml 之外,定義 Context 元素的檔案只能定義一個 Context 元素。

除了明確指定的 Context 元素之外,還有幾種技術可以自動為您建立 Context 元素。請參閱 自動應用程式部署使用者 Web 應用程式 以取得更多資訊。

若要定義使用單一 WAR 檔案或目錄的多個內容,請使用上方 命名 區段中所述的選項之一,來建立一個路徑與基本檔案名稱無關的 Context

屬性

常見屬性

Context 的所有實作都支援下列屬性

屬性 說明
allowCasualMultipartParsing

當呼叫 HttpServletRequest.getPart* 或 HttpServletRequest.getParameter* 時,如果 Tomcat 應自動剖析 multipart/form-data 要求主體,即使目標 servlet 未標記 @MultipartConfig 標註(有關詳細資訊,請參閱 Servlet 規格 3.0,第 3.2 節)。請注意,除了 false 之外的任何設定都會導致 Tomcat 以技術上不符合規格的方式運作。預設值為 false

allowMultipleLeadingForwardSlashInPath

Tomcat 會將 URI 中多個 / 字元的順序正規化為單一 /。這是為了與檔案系統的行為保持一致,因為 URI 通常會轉譯成檔案系統路徑。因此,預期 HttpServletRequest#getContextPath() 的傳回值會以多個 / 字元為某些 URI 開頭。如果此值直接與 HttpServletResponse#sendRedirect() 一起使用,則會造成問題,因為以 // 開頭的重新導向路徑會被視為相對於通訊協定的重新導向。為避免潛在問題,Tomcat 會將 HttpServletRequest#getContextPath() 傳回值開頭的多個前導 / 字元壓縮成單一 /。此屬性的預設值為 false,這會啟用多個 / 字元的壓縮。若要停用此行為,請將此屬性設定為 true

altDDName

此內容的替代部署描述符的絕對路徑。這會覆寫位於 /WEB-INF/web.xml 的預設部署描述符。

alwaysAccessSession

如果此值為 true,則與工作階段相關聯的每個要求都會導致工作階段的最後存取時間更新,無論要求是否明確存取工作階段。

如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 設定為 true,則此設定的預設值會是 true,否則預設值會是 false

backgroundProcessorDelay

此值代表在此內容及其子容器(包括所有包裝器)上呼叫 backgroundProcess 方法之間的延遲(以秒為單位)。如果其延遲值不為負值(這表示它們正在使用自己的處理緒執行緒),則不會呼叫子容器。將此值設定為正值會導致產生執行緒。在等待指定的時間量後,執行緒會在此主機及其所有子容器上呼叫 backgroundProcess 方法。內容會使用背景處理來執行工作階段到期和類別監控以重新載入。如果未指定,此屬性的預設值為 -1,這表示內容會依賴其父主機的背景處理執行緒。

className

要使用的實作的 Java 類別名稱。此類別必須實作 org.apache.catalina.Context 介面。如果未指定,則會使用標準值(如下所定義)。

containerSciFilter

指定應濾除並不用於此內容之容器提供 SCI 的正規表示式。比對使用 java.util.regex.Matcher.find(),因此正規表示式只需要比對容器提供 SCI 的完全限定類別名稱的子字串,即可將其濾除。若未指定,則不會套用任何濾除。

contextGetResourceRequiresSlash

如果為 true,則傳遞給 ServletContext.getResource()ServletContext.getResourceAsStream() 的路徑必須以「/」開頭。如果為 false,則像 getResource("myfolder/myresource.txt") 這類的程式碼會運作,因為 Tomcat 會在提供的路徑前加上「/」。

如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 設定為 true,則此設定的預設值會是 true,否則預設值會是 false

cookies

如果希望使用 Cookie 來進行會話識別通訊(這是預設值),請設為 true。如果希望停用 Cookie 來進行會話識別通訊,並僅依賴應用程式進行 URL 改寫,請設為 false

createUploadTargets

如果 Tomcat 應嘗試為 Servlet 的 MultipartConfig 中指定的暫時上傳位置建立位置(如果位置尚不存在),請設為 true。如果未指定,則會使用預設值 false

crossContext

如果希望此應用程式中的 ServletContext.getContext() 呼叫能成功傳回在這個虛擬主機上執行的其他 Web 應用程式的要求分派器,請設為 true。在注重安全的環境中設為 false(預設值),以讓 getContext() 永遠傳回 null

dispatcherWrapsSameObject

如果為 true,則會檢查傳遞給應用程式分派器的任何包裝要求或回應物件,以確保它已包裝原始要求或回應。

如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 設定為 true,則此設定的預設值會是 true,否則預設值會是 false

docBase

此 Web 應用程式的文件基礎目錄(也稱為內容根目錄),或 Web 應用程式封存檔檔案的路徑名稱(如果此 Web 應用程式是直接從 WAR 檔案執行)。您可以為此目錄或 WAR 檔案指定絕對路徑名稱,或相對於擁有者 主機appBase 目錄的路徑名稱。

除非 Context 元素定義在 server.xml 中,或 docBase 不位於 主機appBase 下,否則不得設定此欄位的數值。

如果 docBase 使用符號連結,則對符號連結的變更只有在 Tomcat 重新啟動或取消部署並重新部署內容後才會生效。內容重新載入並不足夠。

dispatchersUseEncodedPaths

控制用於取得請求調度程式的呼叫中所使用的路徑是否預期會編碼。這會影響 Tomcat 處理取得請求調度程式的呼叫的方式,以及 Tomcat 內部產生用於取得請求調度程式的路徑的方式。如果未指定,則使用預設值 true。為請求調度程式編碼/解碼路徑時,總是使用 UTF-8。

failCtxIfServletStartFails

設定為 true,如果任何載入時啟動 >=0 的 servlet 啟動失敗,則內容會啟動失敗。

如果未指定,則使用父 Host 組態中同名的屬性(如果已指定)。否則,使用預設值 false

fireRequestListenersOnForwards

設定為 true,當 Tomcat 轉發請求時,會觸發任何已設定的 ServletRequestListeners。這主要用於使用 ServletRequestListeners 設定請求必要環境的 CDI 架構使用者。如果未指定,則使用預設值 false

logEffectiveWebXml

如果要在應用程式啟動時記錄用於 Web 應用程式的有效 web.xml(在 INFO 層級),請設定為 true。有效 web.xml 是將應用程式的 web.xml 與 Tomcat 設定的任何預設值和發現的任何 web-fragment.xml 檔案及註解結合的結果。如果未指定,則使用預設值 false

mapperContextRootRedirectEnabled

如果已啟用,則 Web 應用程式內容根目錄的請求會由 Mapper(而不是預設的 Servlet)重新導向(加上尾斜線)(如果需要)。這更有效率,但會確認內容路徑存在的副作用。如果未指定,則使用預設值 true

mapperDirectoryRedirectEnabled

如果已啟用,則 Web 應用程式目錄的請求會由 Mapper(而不是預設的 Servlet)重新導向(加上尾斜線)(如果需要)。這更有效率,但會確認目錄存在的副作用。如果未指定,則使用預設值 false

override

設定為 true 以忽略全域或 Host 預設內容中的任何設定。預設情況下,會使用預設內容的設定,但可以透過明確地為內容設定相同的屬性來覆寫這些設定。

parallelAnnotationScanning

設定為 true 時,將使用公用程式執行器執行註解掃描。它允許平行處理掃描,這可能會以較高的伺服器負載為代價來改善部署類型。如果未指定,則使用預設值 false

path

此 Web 應用程式的內容路徑,與每個請求 URI 的開頭相符,以選取適當的 Web 應用程式進行處理。特定 主機 中的所有內容路徑都必須是唯一的。如果您指定一個空字串 ("") 的內容路徑,您就是在為此主機定義預設 Web 應用程式,它將處理未指定給其他內容的路徑的所有請求。

此屬性只能在 server.xml 中靜態定義內容路徑時使用。在所有其他情況下,將從用於 .xml 內容路徑檔案或 docBase 的檔案名稱推論路徑。

即使在 server.xml 中靜態定義內容路徑,除非 docBase 未位於 主機appBase 下,或 deployOnStartupautoDeploy 都是 false,否則不得設定此屬性。如果不遵循此規則,可能會導致重複部署。

preemptiveAuthentication

設定為 true,且使用者提供未受安全性約束保護的資源的憑證時,如果驗證器支援先發制人的驗證(Tomcat 提供的標準驗證器支援),則會處理使用者的憑證。如果未指定,則使用預設值 false

privileged

設定為 true 以允許此內容路徑使用容器 servlet,例如管理員 servlet。使用 privileged 屬性會將內容路徑的父類別載入器變更為伺服器類別載入器,而不是共用類別載入器。請注意,在預設安裝中,共用類別載入器用於伺服器共用類別載入器。

reloadable

如果您希望 Catalina 監控 /WEB-INF/classes//WEB-INF/lib 中的類別是否有變更,並在偵測到變更時自動重新載入 Web 應用程式,請設定為 true。此功能在應用程式開發期間非常有用,但它需要大量的執行時間開銷,不建議在已部署的生產應用程式上使用。這就是此屬性的預設設定為 false 的原因。但是,您可以使用 管理員 Web 應用程式依需要觸發已部署應用程式的重新載入。

resourceOnlyServlets

以逗號分隔的 Servlet 名稱清單(如在 /WEB-INF/web.xml 中所用),預期資源存在。確保與預期資源存在的 Servlet(例如 JSP Servlet)關聯的歡迎檔案,在沒有資源存在時不會被使用。這避免了由 Servlet 3.0 規範第 10.10 節中歡迎檔案對應說明所造成的議題。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系統屬性 設為 true,此屬性的預設值將為空字串,否則預設值將為 jsp

sendRedirectBody

如果為 true,重新導向回應將包含簡短的回應主體,其中包含 RFC 2616 建議的重新導向詳細資料。這在預設情況下會停用,因為包含回應主體可能會對某些應用程式元件(例如壓縮篩選器)造成問題。

sessionCookieDomain

用於此內容所建立的所有會話 Cookie 的網域。如果設定,這將覆寫 Web 應用程式所設定的任何網域。如果未設定,將使用 Web 應用程式所指定的任何值(如果有的話)。

sessionCookieName

用於此內容所建立的所有會話 Cookie 的名稱。如果設定,這將覆寫 Web 應用程式所設定的任何名稱。如果未設定,將使用 Web 應用程式所指定的任何值(如果有的話),或者如果 Web 應用程式未明確設定,則使用名稱 JSESSIONID

sessionCookiePath

用於此內容所建立的所有會話 Cookie 的路徑。如果設定,這將覆寫 Web 應用程式所設定的任何路徑。如果未設定,將使用 Web 應用程式所指定的任何值,或者如果 Web 應用程式未明確設定,則使用內容路徑。若要設定所有 Web 應用程式以使用空路徑(這對於 portlet 規範實作很有用),請在全域 CATALINA_BASE/conf/context.xml 檔案中將此屬性設為 /

注意:一旦使用 sessionCookiePath="/" 的 Web 應用程式取得一個工作階段,在同一個主機中所有後續的工作階段,只要也設定 sessionCookiePath="/",將永遠使用同一個工作階段 ID。即使工作階段失效並建立新的工作階段,也是如此。這使得工作階段固定保護更困難,需要客製化 Tomcat 特定的程式碼來變更多個應用程式共用的工作階段 ID。

sessionCookiePathUsesTrailingSlash

某些瀏覽器,例如 Internet Explorer、Safari 和 Edge,會傳送一個工作階段 Cookie 給路徑為 /foo 的內容,要求 /foobar 違反 RFC6265。這可能會將部署在 /foo 的應用程式的工作階段 ID 暴露給部署在 /foobar 的應用程式。如果部署在 /foobar 的應用程式不受信任,這可能會造成安全風險。不過,請注意 RFC 6265 第 8.5 節明確指出,路徑本身不應視為足夠防止不受信任的應用程式存取其他應用程式的 Cookie。為了降低此風險,這個屬性可以設定為 true,而 Tomcat 會在與工作階段 Cookie 相關的路徑中新增一個尾部斜線,因此,在上述範例中,Cookie 路徑會變成 /foo/。不過,如果 Cookie 路徑為 /foo/,瀏覽器將不再傳送 Cookie 給 /foo 的要求。除非有一個 servlet 對應到 /*,否則這不應該會造成問題。在此情況下,這個屬性需要設定為 false 來停用此功能。此屬性的預設值為 false

suspendWrappedResponseAfterForward

如果此旗標的值為 true,Catalina 會在轉送後暫停包裝的回應,而不是關閉它們。如果未指定,此旗標的預設值為 false

swallowAbortedUploads

如果 Tomcat 不應讀取任何額外的要求主體資料以中斷上傳,而應中斷用戶端連線,則設定為 false。此設定用於下列情況

  • 要求主體的大小大於連接器中設定的 maxPostSize
  • 達到多部分上傳的大小限制
  • servlet 將回應狀態設定為 413(要求實體太大)

不讀取額外資料會更快釋放要求處理執行緒。很遺憾,如果無法寫入完整的要求,大多數 HTTP 用戶端不會讀取回應。

預設值為 true,因此會讀取額外資料。

請注意,如果在要求處理期間發生觸發 5xx 回應的錯誤,任何未讀取的要求資料都將永遠被忽略,而且一旦寫入錯誤回應,用戶端連線就會關閉。

swallowOutput

如果此標記的值為 true,網路應用程式輸出至 System.out 和 System.err 的位元組將會重新導向至網路應用程式記錄器。如果未指定,此標記的預設值為 false

tldValidation

如果此標記的值為 true,TLD 檔案將在內容啟動時進行 XML 驗證。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系統屬性 設為 true,此屬性的預設值將為 true,否則預設值將為 false。將此屬性設為 true 會產生效能損失。

useBloomFilterForArchives

已棄用:如果此值為 true,則會使用布隆過濾器來加速封存查詢。對於包含大量 JAR 的網路應用程式,這有助於提升部署速度。

如果未指定,將使用預設值 false

此值可由 資源 中的 archiveIndexStrategy 覆寫

useHttpOnly

是否應在階段記錄器上設定 HttpOnly 標記,以防止用戶端端腳本存取階段 ID?預設為 true

usePartitioned

是否應在階段記錄器上設定 Partitioned 標記?預設為 false

注意:用於表示分區記錄器作為 CHIPS 一部分的屬性名稱並未由 RFC 定義,且一旦 RFC 中包含等效功能,可能會以非向下相容的方式變更。

useRelativeRedirects

控制由呼叫 jakarta.servlet.http.HttpServletResponse#sendRedirect(String) 產生的 HTTP 1.1 和後續位置標頭是否會使用相對或絕對重新導向。相對重新導向較為有效率,但可能無法與變更內容路徑的反向代理程式搭配使用。請注意,不建議使用反向代理程式變更內容路徑,因為這會產生多項問題。絕對重新導向應可與變更內容路徑的反向代理程式搭配使用,但如果過濾器變更了架構和/或埠,則可能會導致 org.apache.catalina.filters.RemoteIpFilter 產生問題。如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE 系統屬性 設為 true,此屬性的預設值將為 false,否則預設值將為 true

validateClientProvidedNewSessionId

當用戶端提供新階段的 ID 時,此屬性會控制是否驗證該 ID。使用用戶端提供的階段 ID 的唯一使用案例是在多個網路應用程式中使用共用階段 ID。因此,任何用戶端提供的階段 ID 都應已存在於另一個網路應用程式中。如果啟用此檢查,只有在階段 ID 存在於目前主機的至少一個其他網路應用程式中時,才會使用用戶端提供的階段 ID。請注意,無論此設定為何,以下額外測試都將永遠套用

  • 階段 ID 由記錄器提供
  • 階段記錄器的路徑為 {@code /}

如果未指定,將使用預設值 true

wrapperClass

此 Context 管理的 servlet 將使用的 `org.apache.catalina.Wrapper` 實作類別的 Java 類別名稱。如果未指定,將使用標準預設值。

xmlBlockExternal

如果此旗標的值為 `true`,將不允許解析此 Web 應用程式的 `web.xml`、`web-fragment.xml`、`tomcat-web.xml`、`*.tld`、`*.jspx`、`*.tagx` 和 `tagPlugins.xml` 檔案,以載入外部實體。如果未指定,將使用 `true` 的預設值。

xmlNamespaceAware

如果此旗標的值為 `true`,將以符合名稱空間的方式解析此 Web 應用程式的 `web.xml`、`web-fragment.xml` 和 `tomcat-web.xml` 檔案。請注意,`*.tld`、`*.jspx` 和 `*.tagx` 檔案總是使用符合名稱空間的剖析器來剖析,而 `tagPlugins.xml` 檔案(如果有)則從不使用符合名稱空間的剖析器來剖析。另請注意,如果您開啟此旗標,您可能還需要開啟 `xmlValidation`。如果 `org.apache.catalina.STRICT_SERVLET_COMPLIANCE` 系統屬性 設為 `true`,此屬性的預設值將為 `true`,否則預設值將為 `false`。將此屬性設為 `true` 會造成效能損失。

xmlValidation

如果此旗標的值為 `true`,將使用驗證剖析器來解析此 Web 應用程式的 `web.xml`、`web-fragment.xml` 和 `tomcat-web.xml` 檔案。如果 `org.apache.catalina.STRICT_SERVLET_COMPLIANCE` 系統屬性 設為 `true`,此屬性的預設值將為 `true`,否則預設值將為 `false`。將此屬性設為 `true` 會造成效能損失。

標準實作

Context 的標準實作是 org.apache.catalina.core.StandardContext。它支援以下額外屬性(除了上面列出的共用屬性之外)

屬性 說明
addWebinfClassesResources

此屬性控制除了從 Web 應用程式 JAR 檔案中的 `META-INF/resources` 提供靜態資源之外,是否也從 `WEB-INF/classes/META-INF/resources` 提供靜態資源。這只適用於主版本為 3 或更高的 Web 應用程式。由於這是 Servlet 3 規範的專有延伸,因此預設為停用。若要啟用此功能,請將屬性設為 `true`。

antiResourceLocking

如果為 true,Tomcat 將會防止任何檔案鎖定。這將會大幅影響應用程式的啟動時間,但允許在可能發生檔案鎖定的平台或組態上完全熱部署和取消部署 Web 應用程式。如果未指定,預設值為 false

請注意,將此設定為 true 會產生一些副作用,包括停用正在執行伺服器中的 JSP 重新載入:請參閱 Bugzilla 37668

請注意,在主機的 appBase(預設為 webapps 目錄)外部的應用程式中將此旗標設定為 true,將會導致應用程式在 Tomcat 關閉時被刪除。您可能不希望這樣做,因此在對主機的 appBase 外部的 Web 應用程式設定 antiResourceLocking=true 之前,請三思而後行。

clearReferencesHttpClientKeepAliveThread

如果為 true,且此 Web 應用程式已啟動 sun.net.www.http.HttpClient 保持連線計時器執行緒,且仍正在執行,Tomcat 將會將該執行緒的內容類別載入器從 Web 應用程式類別載入器變更為 Web 應用程式類別載入器的父類別載入器,以防止記憶體外洩。請注意,保持連線計時器執行緒會在所有保持連線都過期後自行停止,然而,在繁忙的系統上,這可能需要一些時間。如果未指定,將會使用預設值 true

clearReferencesObjectStreamClassCaches

如果為 true,當 Web 應用程式停止時,Tomcat 會在用於序列化處理的 ObjectStreamClass 類別中尋找 Web 應用程式載入類別的 SoftReference,並清除找到的任何 SoftReference。此功能使用反射來識別 SoftReference,因此需要設定命令列選項 -XaddExports:java.base/java.io=ALL-UNNAMED。如果未指定,將會使用預設值 true

ObjectStreamClass 相關的記憶體外洩問題已在 Java 19 之後、Java 17.0.4 之後和 Java 11.0.16 之後獲得修復。在執行包含修復程式的 Java 版本時,將會停用檢查。

clearReferencesRmiTargets

如果為 true,Tomcat 會尋找與 RMI 目標相關的記憶體外洩,並清除找到的任何外洩。此功能使用反射來識別外洩,因此需要設定命令列選項 -XaddExports:java.rmi/sun.rmi.transport=ALL-UNNAMED。沒有記憶體外洩的應用程式應可正確操作,並將此屬性設定為 false。如果未指定,將使用預設值 true

clearReferencesStopThreads

如果為 true,Tomcat 會嘗試終止由 Web 應用程式啟動的執行緒。終止執行緒是透過已棄用的(出於正當理由)Thread.stop() 方法來執行,並且可能會導致不穩定。因此,啟用此功能應視為開發環境中的最後手段,不建議在生產環境中使用。如果未指定,將使用預設值 false。如果啟用此功能,Web 應用程式可能需要長達兩秒的時間才能停止,因為執行緒會在呼叫任何剩餘執行緒上的 Thread.stop() 之前,給予長達兩秒的時間來正常停止。

clearReferencesStopTimerThreads

如果為 true,Tomcat 會嘗試終止由 Web 應用程式啟動的 java.util.Timer 執行緒。與標準執行緒不同,計時器執行緒可以安全地停止,儘管應用程式可能仍有副作用。如果未指定,將使用預設值 false

clearReferencesThreadLocals

如果為 true,Tomcat 會嘗試清除已使用 Web 應用程式載入的類別來填入的 java.lang.ThreadLocal 變數。如果未指定,將使用預設值 true

copyXML

如果要將嵌入在應用程式中的內容 XML 描述符(位於 /META-INF/context.xml)在部署應用程式時複製到擁有者的 主機xmlBase,請設定為 true。在後續啟動時,即使嵌入在應用程式中的描述符較新,也會優先使用複製的內容 XML 描述符,而不是嵌入在應用程式中的任何內容 XML 描述符。預設值為 false。請注意,如果擁有者的 主機deployXML 屬性為 false 或如果擁有者的 主機copyXML 屬性為 true,則此屬性不會有任何作用。

jndiExceptionOnFailedWrite

如果為 true,任何應用程式嘗試透過呼叫 bind()、unbind()、createSubContext()、destroySubContext() 或 close() 來修改提供的 JNDI 內容,都會觸發 javax.naming.OperationNotSupportedException,這是 Jakarta EE 規範的 EE.5.3.4 節所要求的。此例外情況可透過將此屬性設定為 false 來停用,在這種情況下,任何呼叫修改 JNDI 內容的呼叫都會在進行任何變更的情況下傳回,而傳回值的函式會傳回 null。如果未指定,將使用符合規範的預設值 true

renewThreadsWhenStoppingContext

如果為 true,當此內容停止時,Tomcat 會更新用於提供此內容的執行緒池中的所有執行緒。這還需要在 server.xml 中設定 ThreadLocalLeakPreventionListener,並且 ExecutorthreadRenewalDelay 屬性大於或等於 0。如果未指定,將使用預設值 true

skipMemoryLeakChecksOnJvmShutdown

如果為 true,當 Web 應用程式停止時,如果該 Web 應用程式是 JVM 關閉的一部分,Tomcat 將不會執行一般的記憶體外洩檢查。如果未指定,將使用預設值 false

unloadDelay

容器等待 servlet 卸載的毫秒數。如果未指定,預設值為 2000 毫秒。

unpackWAR

如果為 false,擁有者 HostunpackWARs 屬性將被覆寫,且 WAR 檔案不會被解壓縮。如果為 true,擁有者 HostunpackWARs 屬性的值將決定是否解壓縮 WAR。如果未指定,預設值為 true

useNaming

設為 true (預設值) 以讓 Catalina 為此 Web 應用程式啟用與 Jakarta EE 平台慣例相容的 JNDI InitialContext

workDir

由這個 Context 提供的暫存目錄的路徑名稱,供關聯 Web 應用程式中的 servlet 暫時讀寫使用。此目錄將透過 servlet context 屬性 (類型為 java.io.File) 對 Web 應用程式中的 servlet 可見,名稱為 jakarta.servlet.context.tempdir,如 Servlet 規範中所述。如果未指定,將提供 $CATALINA_BASE/work 下的適當目錄。

巢狀元件

您可以在 Context 元素中巢狀對應元素,最多巢狀一個以下公用程式元件實例

  • Cookie Processor - 設定 HTTP cookie 標頭的剖析和產生。
  • Loader - 設定 Web 應用程式類別載入器,將用於載入此 Web 應用程式的 servlet 和 bean 類別。通常,類別載入器的預設設定就已足夠。
  • Manager - 設定會話管理員,將用於為此 Web 應用程式建立、銷毀和保留 HTTP 會話。通常,會話管理員的預設設定就已足夠。
  • Realm - 設定一個領域,讓其使用者資料庫及其關聯的角色可專門用於這個特定的 Web 應用程式。如果未指定,此 Web 應用程式將使用與擁有者 HostEngine 關聯的領域。
  • 資源 - 設定資源管理員,用於存取與此 Web 應用程式相關聯的靜態資源。一般來說,資源管理員的預設設定就已足夠。
  • WatchedResource - 自動部署程式會監控 Web 應用程式的指定靜態資源是否有更新,如果有更新,就會重新載入 Web 應用程式。此元素的內容必須是字串。
  • JarScanner - 設定 Jar 掃描器,用於掃描 Web 應用程式中是否有 JAR 檔案和類別檔案目錄。通常會在 Web 應用程式啟動時使用,用於識別設定檔,例如 TLD 或 web-fragment.xml 檔案,這些檔案必須在 Web 應用程式初始化時處理。一般來說,Jar 掃描器的預設設定就已足夠。

特殊功能

記錄

一個內容與 org.apache.catalina.core.ContainerBase.[enginename].[hostname].[path] 記錄類別相關聯。請注意,括號實際上是名稱的一部分,不要省略。

存取記錄

當您執行 Web 伺服器時,通常會產生一個輸出檔案,稱為存取記錄,其中會以標準格式針對伺服器處理的每個要求產生一行資訊。Catalina 包含一個可選擇的 Valve 實作,可以用來建立與 Web 伺服器建立的相同標準格式的存取記錄,或任何數量的自訂格式。

您可以要求 Catalina 為 EngineHostContext 處理的所有要求建立存取記錄,方法是巢狀 Valve 元素,如下所示

<Context>
  ...
  <Valve className="org.apache.catalina.valves.AccessLogValve"
         prefix="localhost_access_log" suffix=".txt"
         pattern="common"/>
  ...
</Context>

請參閱 存取記錄 Valve 以取得支援設定屬性的詳細資訊。

自動 Context 組態

如果您使用標準的 Context 實作,當 Catalina 啟動或此 Web 應用程式重新載入時,會自動執行下列設定步驟。不需要特殊設定即可啟用此功能。

  • 如果您尚未宣告自己的 Loader 元素,就會設定標準的 Web 應用程式類別載入器。
  • 如果您尚未宣告自己的 Manager 元素,就會設定標準的階段管理員。
  • 如果您尚未宣告自己的 Resources 元素,就會設定標準的資源管理員。
  • conf/web.xml 中列出的 Web 應用程式屬性會做為此 Web 應用程式的預設值。這用於建立預設對應 (例如將 *.jsp 副檔名對應到對應的 JSP servlet),以及適用於所有 Web 應用程式的其他標準功能。
  • 此 Web 應用程式中 /WEB-INF/tomcat-web.xml 資源中列出的 Web 應用程式屬性會被處理 (如果此資源存在),優先於預設值。
  • 此 Web 應用程式中,列於 /WEB-INF/web.xml 資源的 Web 應用程式屬性將會處理(如果此資源存在)。
  • 如果您的 Web 應用程式已指定可能需要使用者驗證的安全約束,將會設定一個適當的驗證器,以實作您已選取的登入方法。

Context 參數

您可以設定命名值,透過在這個元素內嵌套 <Parameter> 元素,這些命名值將對 Web 應用程式顯示為 servlet context 初始化參數。例如,您可以建立一個像這樣的初始化參數

<Context>
  ...
  <Parameter name="companyName" value="My Company, Incorporated"
         override="false"/>
  ...
</Context>

這等同於在 Web 應用程式部署描述符 (/WEB-INF/web.xml) 中包含下列元素

<context-param>
  <param-name>companyName</param-name>
  <param-value>My Company, Incorporated</param-value>
</context-param>

不需要修改部署描述符來自訂這個值。

<Parameter> 元素的有效屬性如下

屬性 說明
description

此 context 初始化參數的選用人可讀描述。

name

要建立的 context 初始化參數的名稱。

override

如果您希望 web 應用程式部署描述符中找到的相同參數名稱的 <context-param> 覆寫在此處指定的數值,請將此設定為 false。預設允許覆寫。

value

當呼叫 ServletContext.getInitParameter() 時,將會顯示給應用程式的參數值。

環境項目

您可以設定命名值,透過在這個元素內嵌套 <Environment> 項目,這些命名值將對 Web 應用程式顯示為環境項目資源。例如,您可以建立一個像這樣的環境項目

<Context>
  ...
  <Environment name="maxExemptions" value="10"
         type="java.lang.Integer" override="false"/>
  ...
</Context>

這等同於在 Web 應用程式部署描述符 (/WEB-INF/web.xml) 中包含下列元素

<env-entry>
  <env-entry-name>maxExemptions</env-entry-name>
  <env-entry-value>10</env-entry-value>
  <env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>

不需要修改部署描述符來自訂這個值。

<Environment> 元素的有效屬性如下

屬性 說明
description

此環境項目的選用人可讀描述。

name

要建立的環境項目的名稱,相對於 java:comp/env context。

override

如果您希望 web 應用程式部署描述符中找到的相同環境項目名稱的 <env-entry> 覆寫在此處指定的數值,請將此設定為 false。預設允許覆寫。

type

Web 應用程式預期的此環境項目的完全限定 Java 類別名稱。必須是 web 應用程式部署描述符中 <env-entry-type> 的合法值。

value

當從 JNDI 背景請求時,將會顯示給應用程式的參數值。此值必須可轉換為由 type 屬性定義的 Java 類型。

生命週期偵聽器

如果您已實作一個 Java 物件,需要知道此 背景 何時啟動或停止,您可以透過在此元素內嵌套一個 偵聽器 元素來宣告它。您指定的類別名稱必須實作 org.apache.catalina.LifecycleListener 介面,且此類別必須封裝在 jar 中,並放置在 $CATALINA_HOME/lib 目錄中。它將收到關於對應生命週期事件發生的通知。此類偵聽器的設定如下

<Context>
  ...
  <Listener className="com.mycompany.mypackage.MyListener" ... >
  ...
</Context>

請注意,偵聽器可以有任意數量的其他屬性,這些屬性可以從此元素設定。屬性名稱會使用標準屬性方法命名模式,與對應的 JavaBean 屬性名稱相符。

要求篩選器

您可以要求 Catalina 檢查傳送至周圍 引擎主機背景 元素的每個內部請求的 IP 位址或主機名稱。遠端位址或名稱將會與設定的「接受」和/或「拒絕」篩選器進行比對,這些篩選器是使用 java.util.regex 正規表示法語法定義的。來自未接受位置的請求將會被拒絕,並顯示 HTTP「禁止」錯誤。範例篩選器宣告

<Context>
  ...
  <Valve className="org.apache.catalina.valves.RemoteHostValve"
         allow=".*\.mycompany\.com|www\.yourcompany\.com"/>
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         deny="192\.168\.1\.\d+"/>
  ...
</Context>

請參閱 遠端位址篩選器遠端主機篩選器,以取得關於所支援設定選項的更多資訊。

資源定義

您可以宣告要傳回給 web 應用程式部署描述子中 <resource-ref><resource-env-ref> 元素的 JNDI 查詢資源特性。您必須同時將所需的資源參數定義為 Resource 元素的屬性,以設定要使用的物件工廠(如果 Tomcat 尚未知道),以及用於設定該物件工廠的屬性。

例如,您可以建立類似這樣的資源定義

<Context>
  ...
  <Resource name="jdbc/EmployeeDB" auth="Container"
            type="javax.sql.DataSource"
     description="Employees Database for HR Applications"/>
  ...
</Context>

這等同於在 Web 應用程式部署描述符 (/WEB-INF/web.xml) 中包含下列元素

<resource-ref>
  <description>Employees Database for HR Applications</description>
  <res-ref-name>jdbc/EmployeeDB</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

不需要修改部署描述符來自訂這個值。

<Resource> 元素的有效屬性如下

屬性 說明
auth

指定 Web 應用程式程式碼是否以程式化方式登入對應的資源管理員,或容器是否會代表應用程式登入資源管理員。此屬性的值必須為 ApplicationContainer。如果 Web 應用程式將在 Web 應用程式部署描述子中使用 <resource-ref> 元素,則此屬性為必要,但如果應用程式改用 <resource-env-ref>,則此屬性為選用。

closeMethod

當不再需要單例資源時,呼叫單例資源的零參數方法的名稱。這是為了加速資源的清理,否則會作為垃圾回收的一部分。如果 singleton 屬性為 false,則會忽略此屬性。

對於實作 AutoCloseablejavax.sql.DataSourcejavax.sql.XADataSource 資源,例如 Apache Commons DBCP 2 和預設的 Apache Tomcat 連線池,此屬性的預設值為 close。可以將屬性設定為空字串來停用此功能。對於所有其他資源類型,未定義預設值,也不會預設呼叫關閉方法。

description

此資源的選用人可讀描述。

name

相對於 java:comp/env 環境的要建立資源的名稱。

scope

指定是否可以共用透過此資源管理員取得的連線。此屬性的值必須為 ShareableUnshareable。預設假設連線是可共用的。

singleton

指定此資源定義是否為單例資源,亦即只有一個資源實例。如果此屬性為 true,則對此資源的多次 JNDI 查詢會傳回同一個物件。如果此屬性為 false,則對此資源的多次 JNDI 查詢會傳回不同的物件。對於 javax.sql.DataSource 資源,此屬性必須為 true,才能啟用 DataSource 的 JMX 註冊。此屬性的值必須為 truefalse。預設此屬性為 true

type

Web 應用程式在查詢此資源時預期的完全限定 Java 類別名稱。

此元素用於建立至全域 JNDI 資源的連結。然後在連結名稱上執行 JNDI 查詢會傳回連結的全域資源。

例如,您可以建立類似這樣的資源連結

<Context>
  ...
  <ResourceLink name="linkToGlobalResource"
            global="simpleValue"
            type="java.lang.Integer"
  ...
</Context>

<ResourceLink> 元素的有效屬性如下

屬性 說明
global

全域 JNDI 環境中連結的全域資源名稱。

name

相對於 java:comp/env 環境的要建立資源連結的名稱。

type

Web 應用程式在查詢此資源連結時預期的完全限定 Java 類別名稱。

factory

建立這些物件的類別的完全限定 Java 類別名稱。此類別應實作 javax.naming.spi.ObjectFactory 介面。

當屬性 factory="org.apache.naming.factory.DataSourceLinkFactory" 時,資源連結可以使用兩個額外屬性,以允許共用資料來源使用不同的憑證。當這兩個額外屬性與 javax.sql.DataSource 類型結合使用時,不同的內容可以與不同的憑證共用一個全域資料來源。在幕後,呼叫 getConnection() 僅轉換為對全域資料來源的呼叫 getConnection(username, password)。這是讓程式碼透明於所使用架構的簡便方法,但仍可以在全域組態中控制連線(或池)。

屬性 說明
使用者名稱

連結的全域 DataSource 上 getConnection(username, password) 呼叫的 username 值。

密碼

連結的全域 DataSource 上 getConnection(username, password) 呼叫的 password 值。

共用資料來源範例

警告:此功能僅在全域 DataSource 支援 getConnection(username, password) 方法時才有效。Tomcat 預設使用的 Apache Commons DBCP 2 池不支援它。請參閱其 BasicDataSource 類別的 Javadoc。 Apache Tomcat JDBC 池 支援它,但預設情況下此支援已停用,且可透過 alternateUsernameAllowed 屬性啟用。請參閱其文件以取得詳細資訊。

<GlobalNamingResources>
  ...
  <Resource name="sharedDataSource"
            global="sharedDataSource"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            alternateUsernameAllowed="true"
            username="bar"
            password="barpass"
            ...
  ...
</GlobalNamingResources>

<Context path="/foo"...>
  ...
  <ResourceLink
            name="appDataSource"
            global="sharedDataSource"
            type="javax.sql.DataSource"
            factory="org.apache.naming.factory.DataSourceLinkFactory"
            username="foo"
            password="foopass"
  ...
</Context>
<Context path="/bar"...>
  ...
  <ResourceLink
            name="appDataSource"
            global="sharedDataSource"
            type="javax.sql.DataSource"
  ...
</Context>

當在 /foo 內容中提出 getConnection() 要求時,要求會轉換為 getConnection("foo","foopass"),而 /bar 中的要求會直接傳遞。

交易

您可以宣告要為 java:comp/UserTransaction 的 JNDI 查詢傳回的 UserTransaction 的特性。您必須定義一個物件工廠類別來實例化此物件,以及 Transaction 元素的屬性中所需的資源參數,以及用於組態該物件工廠的屬性。

<Transaction> 元素的有效屬性如下

屬性 說明
factory

JNDI 物件工廠的類別名稱。