内容

目录

常规

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

从 8.0.x 或 8.5.x 迁移到 9.0.x

本节列出了 8.0.x / 8.5.x 与 9.0.x 之间的所有已知更改,这些更改可能会在升级时导致向后兼容性问题。其中一些更改和新功能已存在于 Apache Tomcat 8.5.x 中。

需要 Java 8

Apache Tomcat 9.0.x 需要 Java 8 或更高版本。Apache Tomcat 8.0.x 和 8.5.x 需要 Java 7。

规范 API

Apache Tomcat 9 支持 Java Servlet 4.0、JavaServer Pages 2.3、Java Unified Expression Language 3.0 和 Java API for WebSocket 1.0 规范。规范版本之间的更改可以在每个规范文档的更改附录中找到。

Servlet 4.0 API

在使用通配符导入语法的 JSP 页面中,Servlet API 中添加的新类可能会与 Web 应用程序中的类冲突。例如,如果包 "a" 包含类 PushBuilder,则以下 JSP 页面将在 Tomcat 9 中停止编译

<%@page import="a.*"%>
<% PushBuilder pushBuilder = new PushBuilder(); %>

这是因为隐式导入 javax.servlet.http.* 和显式导入 a.* 将提供 Servlet 4.0 中添加的类 PushBuilder 的冲突定义。解决方案是使用显式导入 import="a.PushBuilder"

JavaServer Pages 2.3

这与 Tomcat 8.x 中没有变化。

表达式语言 3.0

这与 Tomcat 8.x 中没有变化。

WebSocket 1.1

这与 Tomcat 8.x 中没有变化。

已移除 BIO 连接器

以下更改存在于 8.5.0 及更高版本中。

HTTP 和 AJP 的 Java 阻塞 IO 实现 (BIO) 已被移除。建议用户切换到 Java 非阻塞 IO 实现 (NIO)。

已移除 Comet 支持

以下更改存在于 8.5.0 及更高版本中。

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

已添加 HTTP/2 支持

以下功能自 8.5.0 起可用。

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 虚拟主机和多证书支持

以下功能自 8.5.0 起可用。

Tomcat 9 支持单个连接器的多个 TLS 虚拟主机,每个虚拟主机都可以支持多个证书。虚拟主机定义嵌套在 Connector 元素中,如果指定了多个虚拟主机,则使用 Connector 上的 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 9 内部 API 与 Tomcat 8 广泛兼容,但细节级别上有很多更改,并且它们在二进制上不兼容。与 Tomcat 内部组件交互的自定义组件的开发人员应该查看相关 API 的 JavaDoc。

特别注意的是

  • 整个连接器进行了重大重构,以减少重复代码并在实现之间对齐行为。(此更改存在于 8.5.x 中。
  • 已从 Realm 中删除了已弃用的 digest 属性。(此更改存在于 8.5.x 中。

已移除 JSR-77 实现

以下更改存在于 8.5.0 及更高版本中。

JSR-77 实现不完整,已在 8.5.x 和 9.0.x 中删除。具体来说,已删除了以下公开给 JMX 的方法。

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

集群

以下更改存在于 8.5.0 及更高版本中。

MessageDispatch15Interceptor 已用于将 Java 5 功能添加到 MessageDispatchInterceptor。通过将 Java 5 功能合并到 MessageDispatchInterceptor,已在 Tomcat 8.5.x 和 9.0.x 中删除了 MessageDispatch15Interceptor

已移除 InstanceListener

以下更改存在于 8.5.0 及更高版本中。

已在 8.5.x 和 9.0.x 中删除了对 InstanceListener 的支持。具体来说,已删除了以下类。

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

SessionManager

以下更改存在于 8.5.0 及更高版本中。

以下会话管理器属性已在 8.5.x 和 9.0.x 中完全删除。

  • 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 配置,它将对这些应用程序的访问限制为来自本地的连接。

Engine 和 Host 配置

当有效值为 1 时,startStopThreads 的行为已更改。在这种情况下,子项将在当前线程上启动,而不是通过配置有单个线程的 ExecutorService 启动。

Context 配置

clearReferencesStatic 属性已在 8.5.x 和 9.0.x 中删除。

日志记录

默认情况下,日志文件将保留 90 天,然后从文件系统中删除。

升级 9.0.x

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

Tomcat 9.0.x 显著更改

Tomcat 开发人员的目标是使每个修补程序版本与之前的版本完全向后兼容。有时,为了修复错误,必须打破向后兼容性。在大多数情况下,这些更改将不会被注意到。本节列出了与向后兼容性不完全兼容的更改,并且在升级时可能会导致中断。

  • 在 9.0.74 及更高版本中,连接器属性 maxParameterCount 的默认值已从 10,000 减少到 1,000。
  • 在 9.0.31 及更高版本中,AJP 连接器的默认侦听地址已更改为环回地址,而不是所有地址。

    参考:AJP 连接器

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

    参考:AJP 连接器

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

    参考:AJP 连接器

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

    参考:AJP 连接器

  • 从 9.0.44 开始,HostConfig.check(String) 方法的语义发生了变化。该方法不再在调用该方法之前将应用程序标记为已服务,而是会在检查资源之前将应用程序标记为已服务,然后在检查完成后取消将应用程序标记为已服务的标记。如果在调用该方法时将应用程序标记为已服务,则该方法将为 NO-OP。

  • 从 9.0.48 开始,NIO 轮询器已简化,并且已删除块轮询器和选择器配置。如果它们存在于配置中,这不会导致启动错误,但可能会产生警告并且不会产生任何影响。

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

  • 从 9.0.53 开始,由于现在使用 java.nio.file.Files 的 Commons FileUpload 的更新分支,使用多部分上传的应用程序需要确保 JVM 配置了足够的直接内存来存储所有正在进行的多部分上传。

  • 从 9.0.56 开始,不再使用系统属性 org.apache.juli.AsyncLoggerPollInterval

Tomcat 9.0.x 配置文件差异

从下面的框中选择一个配置文件、旧版本和新版本,然后单击“查看差异”以查看差异。差异将显示在一个新的选项卡/窗口中。

注意:如果没有差异,您将看到一个错误页面。

您还可以从工作副本中使用类似于以下内容的 Git 命令

git diff 9.0.0 9.0.12 -- conf/