内容
目录
常规
请首先阅读通用 迁移指南页面,以了解 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" />
已添加 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>
元素的值来继承。Manager
的sessionIdLength
属性已被SessionIdGenerator
的sessionIdLength
属性替换。
Cookie
默认的 CookieProcessor
现在是 Rfc6265CookieProcessor
。CookieProcessor
可按 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/