內容

目錄

一般

請先閱讀一般 遷移指南頁面,以了解 Apache Tomcat® 版本之間遷移或升級的常見考量因素。

從 8.0.x 遷移到 8.5.x

本節列出 8.0.x 和 8.5.x 之間所有已知變更,這些變更可能會在升級時造成向後相容性問題。

已移除 BIO 連接器

HTTP 和 AJP 的 Java 阻擋式 I/O 實作 (BIO) 已移除。建議使用者改用 Java 非阻擋式 I/O 實作 (NIO)。從 Tomcat 8.5.17 開始,如果明確設定 BIO 連接器,Tomcat 就不會讓連接器無法啟動,而是自動將連接器切換為使用 NIO 實作,並記錄警告訊息。

HTTP 連接器變更

HTTP 原因短語已 預設移除,但可以使用下列方式重新啟用

sendReasonPhrase
設定屬性.

已移除 Comet 支援

已移除 Comet 支援,沒有直接替換。建議使用 Comet 的應用程式改用 WebSocket。

已新增 HTTP/2 支援

HTTP/2 支援 h2(透過 TLS,經由 ALPN 協商)和 h2c(純文字,經由 HTTP/1.1 升級協商)。HTTP/2 需要明確為連接器啟用。若要啟用,請插入

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
在您想要啟用 HTTP/2 的連接器內。請注意,要為安全的 NIO 或 NIO2 連接器啟用 HTTP/2,這些連接器必須使用 OpenSSL 引擎進行 TLS。

已新增 TLS 虛擬主機和多重憑證支援

Tomcat 8.5 支援單一連接器的多個 TLS 虛擬主機,每個虛擬主機都能夠支援多個憑證。虛擬主機定義會嵌套在連接器元素內,如果指定多個虛擬主機,則使用連接器上的 defaultSSLHostConfigName 屬性指定預設值。憑證定義會嵌套在虛擬主機內。

以下範例顯示如何使用此功能為多個 TLS 虛擬主機設定單一 APR/原生連接器,每個主機都同時擁有 RSA 和 EC 憑證。


<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           maxThreads="150"
           SSLEnabled="true"
           defaultSSLHostConfigName="openoffice.apache.org" >
    <SSLHostConfig hostName="openoffice.apache.org" >
        <Certificate certificateKeyFile="conf/openoffice.apache.org-rsa-key.pem"
                     certificateFile="conf/openoffice.apache.org-rsa-cert.pem"
                     type="RSA" />
        <Certificate certificateKeyFile="conf/openoffice.apache.org-ec-key.pem"
                     certificateFile="conf/openoffice.apache.org-ec-cert.pem"
                     type="EC" />
    </SSLHostConfig>
    <SSLHostConfig hostName="www.openoffice.org" >
        <Certificate certificateKeyFile="conf/www.openoffice.org-rsa-key.pem"
                     certificateFile="conf/www.openoffice.org-rsa-cert.pem"
                     type="RSA" />
        <Certificate certificateKeyFile="conf/www.openoffice.org-ec-key.pem"
                     certificateFile="conf/www.openoffice.org-ec-cert.pem"
                     type="EC" />
    </SSLHostConfig>
</Connector>

內部 API

儘管 Tomcat 8.5 內部 API 與 Tomcat 8.0 廣泛相容,但細節層級已經有許多變更,而且它們並不相容於二進位檔。與 Tomcat 內部互動的客製化元件開發人員應檢閱相關 API 的 JavaDoc。

特別要注意的是

  • 已在所有連接器中進行重大的重構,以減少重複的程式碼並調整各實作之間的行為。
  • 已從 Realm 中移除已棄用的 digest 屬性。現在必須透過 CredentialHandler 設定此屬性。
  • 已變更 AuthenticatorBase 實作,以在子類別上呼叫 doAuthenticate(),而不是 authenticate()

已移除 JSR-77 實作

JSR-77 實作不完整,且已在 8.5.x 中移除。特別是,已移除公開給 JMX 的下列方法。

  • StandardContext.getServlets()
  • StandardContext.isStateManageable()
  • StandardContext.getDeploymentDescriptor()
  • StandardWrapper.isStateManageable()

叢集

MessageDispatch15Interceptor 已用於將 Java 5 功能新增至 MessageDispatchInterceptor。MessageDispatch15Interceptor 已在 Tomcat 8.5.x 中移除,方法是將 Java 5 功能合併至 MessageDispatchInterceptor

已移除 InstanceListener

已在 8.5.x 中移除 InstanceListener 的支援。特別是,已移除下列類別。

  • org.apache.catalina.InstanceListener
  • org.apache.catalina.InstanceEvent
  • org.apache.catalina.util.InstanceSupport

SessionManager

已在 8.5 中完全移除下列階段管理員屬性。

  • distributable
  • maxInactiveInterval
  • sessionIdLength

替換如下

  • distributable 屬性已在 8.0 中棄用,且指定的數值會被忽略。這應透過 Context 設定。數值會根據 /WEB-INF/web.xml<distributable /> 元素是否存在而繼承。
  • maxInactiveInterval 屬性已在 8.0 中棄用。如果指定數值,會發出警告記錄。這應透過 Context 設定。數值會根據 /WEB-INF/web.xml<session-timeout> 元素的數值而繼承。
  • ManagersessionIdLength 屬性已由 SessionIdGeneratorsessionIdLength 屬性取代。

Cookie

預設的 CookieProcessor 現在是 Rfc6265CookieProcessorCookieProcessor 可針對每個 Context 設定,且 LegacyCookieProcessor 可用於取得 8.0.x 行為。

Web 應用程式

Manager 和 HostManager 網路應用程式預設會設定 RemoteAddrValve,將這些應用程式的存取限制為來自本機端連線。

內容設定

clearReferencesStatic 屬性已在 8.5.x 中移除。

升級 8.5.x

當將 Apache Tomcat 實例從 Tomcat 8 的一個版本升級到另一個版本時,特別是在 $CATALINA_HOME 和 $CATALINA_BASE 使用不同的位置時,必須確保組態檔中的任何變更(例如新的屬性和預設值的變更)會套用為升級的一部分。為了協助辨識這些變更,可以使用下方的表單檢視 Tomcat 8 不同版本中組態檔的差異。

Tomcat 8.5.x 顯著變更

Tomcat 開發人員的目標是讓每個修補程式版本完全向下相容於前一個版本。偶爾,為了修正錯誤,必須中斷向下相容性。在大部分情況下,這些變更不會被注意到。本節列出未完全向下相容且在升級時可能會造成中斷的變更。

  • 在 8.5.88 之後,Connector 屬性 maxParameterCount 的預設值已從 10,000 減少到 1,000。
  • 在 8.5.51 之後,AJP Connector 的預設監聽位址已變更為迴圈位址,而非所有位址。

    參考:AJP Connector

  • 在 8.5.51 之後,AJP Connector 的 requiredSecret 屬性已棄用,並由 secret 屬性取代。

    參考:AJP Connector

  • 在 8.5.51 之後,secretRequired 屬性已新增至 AJP Connector。如果設定為預設值 true,除非已指定 secret,否則 AJP Connector 將不會啟動。

    參考:AJP Connector

  • 在 8.5.51 之後,allowedRequestAttributesPattern 屬性已新增至 AJP Connector。具有無法辨識屬性的要求現在會以 403 遭到封鎖。

    參考:AJP Connector

  • 在 8.5.64 之後,HostConfig.check(String) 方法的語意已變更。方法會在呼叫方法之前標記應用程式為已服務,而不是在檢查資源之前標記應用程式為已服務,然後在檢查完成後取消標記應用程式為已服務。如果在呼叫方法時應用程式標記為已服務,則方法將為 NO-OP。

  • 在 8.5.70 之後,由於機密傳輸保證,Tomcat 不再在加入「Cache-Control: private」時加入「Expires」HTTP 回應標頭。對於未明確設定其自己的標頭但依賴 Tomcat 之前行為的應用程式,這可能會導致快取行為的變更。如果您想停用快取,您需要在應用程式中明確設定它。請參閱 BZ 65513 以取得更多資訊。

  • 在 8.5.71 之後,由於現在使用 java.nio.file.Files 的 Commons FileUpload 的更新分支,使用多部分上傳的應用程式需要確保 JVM 設定有足夠的直接記憶體來儲存所有進行中的多部分上傳。

  • 在 8.5.74 之後,系統屬性 org.apache.juli.AsyncLoggerPollInterval 不再使用。

  • 在 8.5.75 之後,已移除 JmxRemoteLifecycleListener。請注意,現代 JVM 不再需要 JMXLifecycleListener 提供的功能。

  • 在 8.5.75 之後,<Connector> 上的 maxSavePostSize 屬性也適用於執行 HTTP/1.1 升級時存在的請求主體。

  • 在 8.5.76 之後,Tomcat 發行版本使用 Java 11 以「Java 7 模式」執行。這應該會產生完全相容的版本,可以在 Java 7 或更新版本下運作。您遇到的任何問題,例如類別檔案版本錯誤、方法不符錯誤或 JVM 驗證器,都應立即回報給 Tomcat 團隊。

Tomcat 8.5.x 設定檔差異

從下方的方塊中選擇組態檔案、舊版本和新版本,然後按一下「檢視差異」以查看差異。差異將顯示在新分頁/視窗中。

注意:如果沒有差異,您將會看到錯誤頁面。

您也可以在工作副本中使用類似於以下的 Git 命令

git diff 8.5.0 8.5.20 -- conf/