内容

目录

常规

请首先阅读常规 迁移指南页面,了解 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 支持

支持通过 ALPN 协商的 h2(通过 TLS)和通过 HTTP/1.1 升级协商的 h2c(明文)的 HTTP/2。需要为连接器明确启用 HTTP/2。要启用它,请插入

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

已添加 TLS 虚拟主机和多证书支持

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

以下示例展示了如何使用此方法为多个 TLS 虚拟主机配置单个 APR/native 连接器,每个主机都具有 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 已用于向 MessageDispatchInterceptor 添加 Java 5 功能。通过将 Java 5 功能合并到 MessageDispatchInterceptor,已在 Tomcat 8.5.x 中删除了 MessageDispatch15Interceptor

已移除 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 中已弃用,并且指定的 value 被忽略。这应通过 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 Web 应用程序默认配置有 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 连接器

  • 在 8.5.51 及更高版本中,AJP 连接器的 requiredSecret 属性已弃用,并由 secret 属性取代。

    参考:AJP 连接器

  • 在 8.5.51 及更高版本中,secretRequired 属性已添加到 AJP 连接器。如果设置为 true(默认值),则 AJP 连接器在未指定 secret 时不会启动。

    参考:AJP 连接器

  • 在 8.5.51 及更高版本中,allowedRequestAttributesPattern 属性已添加到 AJP 连接器。现在,将阻止具有无法识别的属性的请求,并显示 403。

    参考:AJP 连接器

  • 在 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/