内容
目录
通用
请首先阅读通用的迁移指南页面,了解适用于 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 实现并记录警告。
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" />
新增 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>
元素的值而继承。Manager
的sessionIdLength
属性已被SessionIdGenerator
的sessionIdLength
属性替换。
Cookies
默认的 CookieProcessor
现在是 Rfc6265CookieProcessor
。CookieProcessor
可以根据每个 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/