内容

目录

通用

请首先阅读通用的迁移指南页面,了解适用于 Apache Tomcat® 各版本迁移或升级的常见注意事项。

从 8.0.x 迁移到 8.5.x

本节列出了 8.0.x 和 8.5.x 之间所有已知的、可能在升级时导致向后兼容性问题的变更。

BIO 连接器已移除

HTTP 和 AJP 的 Java 阻塞 IO 实现 (BIO) 已被移除。建议用户切换到 Java 非阻塞 IO 实现 (NIO)。自 Tomcat 8.5.17 起,如果显式配置了 BIO 连接器,Tomcat 不会启动失败,而是会自动将连接器切换到使用 NIO 实现并记录警告。

HTTP 连接器变更

HTTP 原因短语已默认移除,但可以通过 sendReasonPhrase 配置属性重新启用。

Comet 支持已移除

Comet 支持已被移除,没有直接的替代方案。建议使用 Comet 的应用程序迁移到 WebSockets。

新增 HTTP/2 支持

HTTP/2 支持 h2(通过 ALPN 协商的 TLS)和 h2c(明文,通过 HTTP/1.1 升级协商)。HTTP/2 需要为连接器显式启用。要启用它,请在连接器内部插入以下内容,您希望为其启用 HTTP/2。请注意,要为安全的 NIO 或 NIO2 连接器启用 HTTP/2,这些连接器必须使用 OpenSSL 引擎进行 TLS。

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
在您希望启用 HTTP/2 的连接器内部。请注意,若要为安全的 NIO 或 NIO2 连接器启用 HTTP/2,这些连接器必须使用 OpenSSL 引擎进行 TLS。

新增 TLS 虚拟主机和多证书支持

Tomcat 8.5 支持单个连接器上的多个 TLS 虚拟主机,每个虚拟主机能够支持多个证书。虚拟主机定义嵌套在 Connector 元素内部,如果指定了多个虚拟主机,则默认值通过 Connector 上的 defaultSSLHostConfigName 属性指定。证书定义嵌套在虚拟主机内部。

以下示例展示了如何使用此功能为一个 APR/native 连接器配置多个 TLS 虚拟主机,每个主机都具有 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 已移除

InstanceListener 的支持已在 8.5.x 中移除。具体来说,以下类已被移除。

  • 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 属性替换。

Cookies

默认的 CookieProcessor 现在是 Rfc6265CookieProcessorCookieProcessor 可以根据每个 Context 配置,并且可以使用 LegacyCookieProcessor 来获得 8.0.x 的行为。

Web 应用程序

Manager 和 HostManager Web 应用程序默认配置了 RemoteAddrValve,该阀门将对这些应用程序的访问限制为来自 localhost 的连接。

上下文配置

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

升级 8.5.x

将 Apache Tomcat 实例从 Tomcat 8 的一个版本升级到另一个版本时,尤其是在使用 $CATALINA_HOME 和 $CATALINA_BASE 的独立位置时,需要确保将配置文件中的任何更改(例如新属性和默认值更改)作为升级的一部分应用。为了帮助识别这些更改,可以使用下面的表单查看 Tomcat 8 不同版本之间配置文件的差异。

Tomcat 8.5.x 值得注意的变更

Tomcat 开发者旨在使每个补丁版本都完全向后兼容之前的版本。偶尔,为了修复 bug,需要打破向后兼容性。在大多数情况下,这些更改不会被注意到。本节列出了不完全向后兼容且在升级时可能导致中断的更改。

  • 从 8.5.88 开始,连接器属性 maxParameterCount 的默认值已从 10,000 减少到 1,000。
  • 从 8.5.51 开始,AJP 连接器的默认监听 地址 已更改为环回地址,而不是所有地址。

    参考:AJP 连接器

  • 从 8.5.51 开始,AJP 连接器的 requiredSecret 属性已弃用,并由 secret 属性替换。

    参考:AJP 连接器

  • 从 8.5.51 开始,secretRequired 属性已添加到 AJP 连接器。如果设置为 true(默认值),则除非指定了 secret,否则 AJP 连接器将不会启动。

    参考:AJP 连接器

  • 从 8.5.51 开始,allowedRequestAttributesPattern 属性已添加到 AJP 连接器。带有无法识别属性的请求现在将被 403 阻止。

    参考:AJP 连接器

  • 从 8.5.64 开始,HostConfig.check(String) 方法的语义已更改。该方法不再在调用方法之前将应用程序标记为已服务,而是在检查资源之前将应用程序标记为已服务,并在检查完成后将应用程序标记为未服务。如果方法调用时应用程序已标记为已服务,则该方法将是一个 NO-OP。

  • 从 8.5.70 开始,Tomcat 不再在添加 "Cache-Control: private" 时因 CONFIDENTIAL 传输保证而添加 "Expires" HTTP 响应头。这可能会导致那些未显式设置自己的头但依赖 Tomcat 以前行为的应用程序的缓存行为发生变化。如果您希望禁用缓存,则需要在应用程序中显式配置它。有关更多信息,请参阅 BZ 65513

  • 从 8.5.71 开始,由于更新后的 Commons FileUpload 分支现在使用 java.nio.file.Files,使用多部分上传的应用程序需要确保 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/