內容
目錄
一般
請先閱讀一般的 遷移指南頁面,以了解在 Apache Tomcat® 版本之間遷移或升級時適用的常見考量。
從 6.0.x 遷移到 7.0.x
本節列出 6.0.x 和 7.0.x 之間所有已知變更,這些變更可能會在升級時造成向下相容性問題。
需要 Java 6
Apache Tomcat 7.0.x 需要 Java 6 或更新版本。Apache Tomcat 6.0.x 需要 Java 5。
Servlet 3.0 API
Apache Tomcat 7 支援 Java Servlet 3.0、JavaServer Pages 2.2、Expression Language 2.2 和 WebSocket 1.1 規範。各規範文件中的「變更」附錄中,可以找到規範版本之間的變更內容。
在使用萬用字元匯入語法的 JSP 頁面中,Servlet API 中新增的類別可能會與 Web 應用程式中的類別產生衝突。例如,如果套件 "a"
包含類別 Part
,則下列 JSP 頁面將無法在 Tomcat 7 中編譯
<%@page import="a.*"%>
<% Part page = new Part(); %>
這是因為隱式匯入 javax.servlet.http.*
和明確匯入 a.*
會提供 Servlet 3.0 中新增的類別 Part
的衝突定義。解決方案是使用明確匯入,import="a.Part"
。
正規表示法
所有使用正規表示式的組態選項現在需要一個單一正規表示式(使用 java.util.regex
),而不是逗號分隔或分號分隔的表示式清單。
這涉及下列部分
- RemoteAddrFilter、RemoteHostFilter 篩選器中的
allow
和deny
屬性,以及 RemoteAddrValve、RemoteHostValve 閥中的allow
和deny
屬性; - RemoteIpFilter、RemoteIpValve中的
internalProxies
、trustedProxies
屬性; - ReplicationValve中的
filter
屬性; - HTTP 連接器中的
restrictedUserAgents
、noCompressionUserAgents
屬性。
請注意,可以使用「|
」運算子(或)連結個別正規表示式。在這個版本和早期的 Tomcat 版本中,「|
」都適用。
部署
XML 環境描述子(META-INF/context.xml
檔案)不再從已部署的 WAR 和目錄複製到主機的 xmlBase
。可以透過將 Host 元素的 copyXML
屬性設定為 true
來啟用 Tomcat 6 的預設行為。
在 7.0.12 到 7.0.47(含)的版本中,主機的 appBase
之外的 WAR 都不會解壓縮,不論 Host
的 unpackWARs
設定為何。請注意,只有 7.0.48 之後才支援此解壓縮功能。請參閱問題 51294。
管理員應用程式
Manager 應用程式已針對 Tomcat 7 之後版本重新調整結構,且有些 URL 已經變更。現在所有用於存取 Manager 應用程式的 URL 都應該以下列選項之一為開頭
- <ContextPath>/html,用於 HTML GUI
- <ContextPath>/文字介面的文字
- <ContextPath>/jmxproxy JMX 代理程式
- <ContextPath>/status 狀態頁面
請注意文字介面的 URL 已從「<ContextPath>」變更為「<ContextPath>/text」。
使用 Manager 應用程式的角色需求已從單一 manager
角色變更為下列四個角色。您需要指定要存取的功能所需的角色。
manager-gui
- 允許存取 HTML GUI 和狀態頁面manager-script
- 允許存取文字介面和狀態頁面manager-jmx
- 允許存取 JMX 代理程式和狀態頁面manager-status
- 僅允許存取狀態頁面
HTML 介面受 CSRF 保護,但文字和 JMX 介面則否。若要維持 CSRF 保護
- 具有
manager-gui
角色的使用者不應同時授予manager-script
或manager-jmx
角色。 - 如果 Manager 應用程式是由具有
manager-script
或manager-jmx
角色的使用者透過瀏覽器存取(例如,測試文字或 jmx 介面,因為這些介面是針對工具而非人類設計),則必須在之後關閉所有瀏覽器視窗以終止工作階段。
角色指令已從 Manager 應用程式中移除,因為它無法與預設組態搭配使用,而且大多數 Realms 不支援提供角色清單。
主機管理員應用程式
主機管理員應用程式已針對 Tomcat 7 之後版本重新調整,而且某些 URL 已變更。所有用於存取主機管理員應用程式的 URL 現在都應從下列選項之一開始
- <ContextPath>/html,用於 HTML GUI
- <ContextPath>/文字介面的文字
請注意文字介面的 URL 已從「<ContextPath>」變更為「<ContextPath>/text」。
使用主機管理員應用程式的角色需求已從單一 admin
角色變更為下列兩個角色。您需要指定要存取的功能所需的角色。
admin-gui
- 允許存取 HTML GUI 和狀態頁面admin-script
- 允許存取文字介面和狀態頁面
HTML 介面受 CSRF 保護,但文字介面則否。若要維持 CSRF 保護
- 具有
admin-gui
角色的使用者不應授予admin-script
角色。 - 如果 Host Manager 應用程式是由具有
admin-script
角色的使用者透過瀏覽器存取(例如,測試文字介面,因為此介面是針對工具而非人類設計),則必須在之後關閉所有瀏覽器視窗才能終止工作階段。
階段管理員設定
已對工作階段管理員進行多項變更,以改善工作階段產生和銷毀的效能,包括工作階段 ID 產生的變更。工作階段 ID 產生的變更利用了 java.secure.SecureRandom
的改善,因為工作階段 ID 產生最初是寫入的。組態變更為
- Manager 的
randomClass
屬性已變更為secureRandomClass
,且提供的類別必須延伸java.secure.SecureRandom
- 已新增兩個新屬性
secureRandomAlgorithm
和secureRandomProvider
,以啟用 SecureRandom 實作的選取。 - 已移除
algorithm
屬性 - 已移除
entropy
屬性
java.secure.SecureRandom
的一個已知問題是其初始化需要來自熵來源的某些隨機資料。對於某些熵來源實作,可能需要一些時間才能收集足夠的隨機資料。如果工作階段 ID 產生器的初始化需要明顯的時間(超過 100 毫秒),將會記錄診斷訊息。例如
DATE org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: 使用 [SHA1PRNG] 建立工作階段 ID 的 SecureRandom 執行個體,花了 [406] 毫秒。
可以透過定義系統屬性來變更 JRE 使用的熵來源。例如
-Djava.security.egd=file:/dev/./urandom
上述值中的「/./」字元是用來解決 JRE 問題 #6202721。
階段 Cookie 設定
隨著 Servlet 3.0 規範中新增 SessionCookieConfig
,已移除多個工作階段 Cookie 組態選項,以減少組態和程式碼的複雜性。
- Connector
.emptySessionPath
:已移除此項目。可以在全域 context.xml(位於CATALINA_BASE/conf/context.xml
)中組態 sessionCookiePath="/",以獲得等效的效果。 org.apache.catalina.SESSION_COOKIE_NAME
系統屬性:已移除此項目。可以在全域 context.xml(位於CATALINA_BASE/conf/context.xml
)中組態sessionCookieName
屬性,以獲得等效的效果。org.apache.catalina.SESSION_PARAMETER_NAME
系統屬性:已移除此項目。可以在全域 context.xml(位於CATALINA_BASE/conf/context.xml
)中組態sessionCookieName
屬性,以獲得等效的效果。- Context
.disableURLRewriting
:已移除此項目。可以在 Web 應用程式或全域CATALINA_BASE/conf/web.xml
檔案中組態session-config/tracking-mode
元素,以獲得等效的效果。
預設情況下,Tomcat 7 中的工作階段和 SSO Cookie 會傳送 HttpOnly 旗標,以指示瀏覽器防止 JavaScript 存取這些 Cookie。這被認為更安全,但它會阻止 JavaScript 存取 Cookie 的值。此功能可以透過 Context 元素上的 useHttpOnly
屬性來控制。(此功能也實作於最新版本的 Tomcat 6.0,但預設為關閉。可以在 Web 應用程式或全域 CATALINA_BASE/conf/context.xml
檔案中的 Context 元素上設定 useHttpOnly="true"
來啟用它)。
Cookie
Tomcat 預設不再接受僅符合規格名稱的 Cookie。不過,已新增一個新的系統屬性 org.apache.tomcat.util.http.ServerCookie.ALLOW_NAME_ONLY
,可用於接受僅名稱的 Cookie。
如果 Cookie 值或路徑包含必須加上引號的字元 (根據 RFC2109 規格),Cookie 會在傳送給用戶端之前自動從「版本 0」Cookie 轉換為「版本 1」Cookie,而這些值會加上雙引號。哪些字元需要加上引號是由多個 系統屬性 控制,例如 org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR
。已知 Internet Explorer 在處理「版本 1」Cookie 時有問題。(錯誤 57872)。
要求屬性
提供用於存取 SSL 會話 ID 的自訂要求屬性 javax.servlet.request.ssl_session
已棄用,取而代之的是 Servlet 規格中定義的新標準要求屬性 javax.servlet.request.ssl_session_id
。對自訂屬性的支援將在 Tomcat 8 中移除。
Comet
為了讓 Comet 在安全性管理員底下執行時能正常運作,Comet 類別已從 org.apache.catalina
套件移至 org.apache.catalina.comet
套件。使用 Comet 的程式碼需要更新並重新編譯,以反映新的套件名稱。
XML 驗證
XML 驗證的設定已簡化。已從 Host 元素中移除 xmlValidation
和 xmlNamespaceAware
屬性。這些屬性以及 tldValidation
和 tldNamespaceAware
現在會針對每個 Context 元素設定。預設值 (每個屬性為 false
) 沒有變更。不過,根據 Servlet 規格的要求,如果 org.apache.catalina.STRICT_SERVLET_COMPLIANCE
系統屬性設為 true
,XML 驗證和命名空間感知會預設啟用。
系統屬性
已修改 org.apache.catalina.STRICT_SERVLET_COMPLIANCE
系統屬性,以提供對其效果的更大控制權。現在每個行為變更都由專用的系統屬性控制。預設行為不變。org.apache.catalina.STRICT_SERVLET_COMPLIANCE
系統屬性現在控制是否對其他系統屬性使用符合規格的預設值。即使 org.apache.catalina.STRICT_SERVLET_COMPLIANCE
為 true
,設定個別系統屬性仍會優先。
已移除 org.apache.coyote.MAX_TRAILER_SIZE
,並以 Connector 的 maxTrailerSize 屬性取代。
處理 conf/web.xml 檔案
歡迎檔案處理
歡迎檔案處理已變更為遵循 Servlet 3.0 規範中的說明。如果您的歡迎檔案清單包含由 servlet 處理的檔案(例如 *.jsp),您可能會觀察到行為的改變。請參閱 Context 中的 resourceOnlyServlets
選項。
註解掃描
Servlet 3.0 規範要求的註解掃描可能會影響您的 Web 應用程式的啟動時間,並增加載入掃描類別所需的記憶體需求。請注意,根據 Servlet EG 的說明,即使是使用 Servlet 2.4 及較舊版本的規範的應用程式也會被掃描。請參閱問題 53619 和使用者郵件清單上的相關討論。
有幾種方法可以處理這個問題。建議的方式是將不需要註解掃描的應用程式標記為不需要註解掃描。這可以在應用程式的 WEB-INF/web.xml
中透過以下步驟完成
-
更新
web-app
元素以指出 Web 應用程式正在使用規範版本 3.0。您可以從預設的conf/web.xml
檔案複製version
、xsi:schemaLocation
、xmlns
和xmlns:xsi
屬性的值。 -
將
metadata-complete="true"
屬性新增到web-app
元素。 -
新增一個空的
<absolute-ordering />
元素。
metadata-complete
屬性從 Servlet 2.5 規範開始支援。absolute-ordering
元素需要 Servlet 3.0。
第二種方法是將 JarScanner 元件設定為根據 JAR 檔案的名稱忽略某些 JAR 檔案。這通常在 conf/catalina.properties
檔案中設定。請參閱組態參考的 系統屬性 章節中關於 jarsToSkip
屬性的文件以取得詳細資訊。從 Tomcat 7.0.30 開始,可以分別設定哪些 JAR 會略過 Servlet 3.0 掃描(掃描註解和 Web 應用程式片段)、TLD 掃描(標籤函式庫)或兩者。Tomcat 的後續版本可能會提供更好的方式來控制此功能。
TLD 處理
TLD 處理已經有了許多改進。除了進行一些內部重構以改善一致性並減少重複之外,還有許多功能性的改進。這些改進包括
- 標籤檔案中的 EL 處理現在與為標籤檔案宣告的 JSP 版本一致。
- JSP 規範的 JSP.7.3.1 區段的要求現在已強制執行,並且不允許將 TLD 檔案放置在
WEB-INF/lib
或WEB-INF/classes
中。
內部 API
雖然 Tomcat 7 內部 API 與 Tomcat 6 廣泛相容,但在詳細層級上有許多變更,而且它們並不二進位相容。與 Tomcat 內部互動的客製元件開發人員應檢閱相關 API 的 JavaDoc。
特別注意
- 所有元件均延伸的 Lifecycle 介面的標準實作。
- 使用泛型。
- 使用 Context 名稱而非 Context 路徑作為主機內 Context 的唯一識別碼。
JSP 編譯器
控制效能最佳化之一的 JspServlet
初始化參數已從 genStrAsCharArray 變更為 genStringAsCharArray,且現在與 Apache Ant 中 Jasper 任務的相關屬性名稱一致。
升級 7.0.x
Tomcat 7.0.x 值得注意的變更
Tomcat 開發人員的目標是讓每個修補程式版本與前一版本完全向下相容。偶爾需要中斷向下相容性才能修正錯誤。在大部分情況下,這些變更不會被注意到。本節列出與前一版本不完全向下相容的變更,且可能會在升級時造成中斷。
- 從 7.0.51 開始,Web 應用程式類別載入器現在比系統類別載入器優先載入類別。
從 7.0.63 開始,連接器上
maxPostSize
屬性的值 0 的意義已變更為表示限制為零,而非沒有限制,以與maxSavePostSize
對齊並更直覺。從 7.0.100 開始,AJP 連接器的預設監聽 位址已變更為迴圈位址,而非所有位址。
參考:AJP 連接器。
從 7.0.100 開始,AJP 連接器的 requiredSecret 屬性已不建議使用,並已由 secret 屬性取代。
參考:AJP 連接器。
從 7.0.100 開始,secretRequired 屬性已新增至 AJP 連接器。如果設定為
true
(預設值),除非已指定 secret,否則 AJP 連接器不會啟動。參考:AJP 連接器。
從 7.0.100 開始,allowedRequestAttributesPattern 屬性已新增至 AJP 連接器。現在會以 403 阻擋具有無法辨識屬性的要求。
參考:AJP 連接器。
Tomcat 7.0.x 設定檔差異
當將 Apache Tomcat 實例從一個 Tomcat 7 版本升級到另一個版本時,特別是在為 $CATALINA_HOME 和 $CATALINA_BASE 使用個別位置時,有必要確保在升級時套用組態檔中的任何變更,例如新屬性和預設值的變更。為協助辨識這些變更,可以使用下方的表單檢視 Tomcat 7 不同版本中組態檔的差異。
從下方方塊中選擇組態檔、舊版本和新版本,然後按一下「檢視差異」以查看差異。差異將顯示在新分頁/視窗中。
注意:如果沒有差異,您將會看到錯誤頁面。
您也可以在工作副本中使用類似以下的 Git 指令
git diff 7.0.0 7.0.80 -- conf/