变更日志
Tomcat 11.0.8 (markt)
Catalina
添加对 java:module
命名空间的支持,该命名空间与 java:comp
命名空间镜像。 (markt)
69690: 当映射的servlet没有 @MultipartConfig
或等效配置时,对内容类型为 multipart/form-data
的请求调用 HttpServletRequest.getParameter()
及相关方法不应触发异常。请注意,在这种情况下调用 getPart()
或 getParts()
将会触发异常。 (markt)
支持解析单个URL段中由 ;
分隔的多个路径参数。基于Chenjp提供的拉取请求 #860。 (markt)
69699: 如果适用,使用会话ID对重写阀门使用的重定向URL进行编码,并在使用重写时处理具有不同会话配置的跨上下文。 (remm)
#863: 在文本重写映射文件的行尾添加注释支持,以使行为与Apache httpd保持一致。拉取请求由Chenjp提供。 (markt)
69706: 修复在允许无限会话超时时引入的FORM中保存请求序列化问题。 (remm)
扩展对Web应用内部路径挂载的Pre-Resources和Post-Resources的路径检查。 (markt)
Coyote
#861: 重构 TaskQueue
以使用新的接口 RetryableQueue
,该接口能够更好地集成提供自己 BlockingQueue
实现的自定义 Executor
。拉取请求由Paulo Almeida提供。 (markt)
通过 Connector
元素上的两个新属性提供对多部分请求处理的更细粒度控制。 maxPartCount
限制多部分请求中的总部件数,maxPartHeaderSize
限制每个部件附带的头部大小。将对这些新属性的支持添加到 ParameterLimitValve
。 (markt)
Jasper
69696: 在编译失败后将JSP包装器标记为重新加载。 (remm)
Web 应用
69694: 改进当复制操作失败时,使用管理器Web应用执行的部署任务的错误报告。 (remm)
其他
将线程名称添加到webappClassLoader.stackTraceRequestThread消息中。补丁由Felix Zhang提供。 (schultz)
将Tomcat Native更新到2.0.9。 (markt)
将Apache Commons FileUpload的内部分支更新到1.6.0-RC1 (2025-06-05)。 (markt)
将EasyMock更新到5.6.0。 (markt)
将Checkstyle更新到10.25.0。 (markt)
Windows安装程序在设置文件权限时调用 icacls.exe
时使用完整路径。 (markt)
tak7iji提供了日语翻译的改进。 (markt)
2025-05-13 Tomcat 11.0.7 (markt)
Catalina
在重写阀门中处理可能的路径参数重写生成。 (remm)
69588: 允许在 PreResources
、JarResources
和 PostResources
上设置 allowLinking
。如果未明确设置,该设置将从 Resources
继承。 (markt)
69633: 添加对使用上下文根映射的过滤器的支持。 (markt)
69643: 优化大量文件的目录列表。补丁由Loic de l'Eprevier提交。 (remm)
#843: 修复部分PUT范围的“差一”验证逻辑以及相关的测试用例。由Chenjp提交。 (remm)
重构GCI servlet以通过 WebResource
API访问资源。 (markt)
69662: 当命名查找失败时,在异常消息中报告名称。基于Donald Smith提交的代码。 (remm)
确保当认证开始时会话具有无限超时时,FORM认证属性 authenticationSessionTimeout
能正常工作。 (markt)
当通过URL访问Web应用资源时,根据文件扩展名提供内容类型。 (markt)
Jasper
69635: 为 jakarta.el.ImportHandler
添加解析内部类的支持。 (markt)
#842: 添加对c:set和c:remove标签的优化执行支持,当通过JSP servlet参数useNonstandardTagOptimizations激活时。 (jengebr)
修复在不区分大小写的文件系统上JSP和标签文件的边缘情况编译错误,该错误由 69635 的测试用例暴露。 (markt)
Web 应用
68876: 文档。使用PlantUML更新服务器启动、请求处理和认证的UML图,并包含每个图的源文件。 (markt)
其他
将Jacoco更新到0.8.13。 (remm)
明确设置用于Javadoc的区域设置。对于官方发布,此区域设置将为英语(美国),以支持可重现构建。 (schultz)
将Byte Buddy更新到1.17.5。 (markt)
将Checkstyle更新到10.23.1。 (markt)
更新文件扩展名到媒体类型的映射,使其与Apache Web服务器(httpd)当前使用的列表对齐。 (markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2025-04-09 Tomcat 11.0.6 (markt)
Catalina
69602: 修复2024年12月发布的版本中的回归,该版本过于严格,并以400响应拒绝了 If-Range
头部中的弱etag。现在将将其视为匹配失败,因为 If-Range
需要强etag。 (remm)
如果部分PUT发送的内容量与指定范围不一致,则返回400。 (remm)
添加一个新的 RateLimiter
实现 org.apache.catalina.util.ExactRateLimiter
,可与 org.apache.catalina.filters.RateLimitFilter
一起使用,以根据精确配置的值提供速率限制。基于Chenjp提供的拉取请求 #794。 (markt)
修复 ExtendedAccessLogValve
中 time-taken
令牌的解析。 (remm)
修复FFM OpenSSL代码在设置SSL引擎和FIPS模式时的调用。 (remm)
69600: 将IPv6本地地址(RFC 4193和RFC 4291)添加到RemoteIpFilter和RemoteIpValve的默认内部代理中。 (markt)
69615: 改进与未找到类资源缓存的集成,适用于使用自定义Web应用类加载器和/或使用反射动态添加外部仓库到Web应用类加载器的用户。 (markt)
为Default servlet添加一个新的初始化参数 - allowPostAsGet
- 它控制是否将使用POST方法对静态资源的直接请求(即非转发或包含)作为使用GET方法进行处理。如果不允许,请求将被拒绝。将请求作为使用GET方法处理的默认行为保持不变。 (markt)
69623: 纠正一个长期存在的回归,该回归导致在启用资源缓存的Web应用中调用 ClassLoader.getResource().getContent()
失败。 (markt)
69634: 避免 JsonErrorReportValve
上的NPE。 (remm)
为 JsonErrorReportValve
添加缺失的 throwable
堆栈跟踪,与 ErrorReportValve
中的堆栈跟踪等效。 (remm)
移除安全管理器支持后,修复 ErrorReportValve
中堆栈跟踪的截断。 (remm)
改进RewriteValve中 %nn
URL编码的处理,并文档化 %nn
URL编码如何与重写规则一起使用。 (markt)
修复调用 WebappClassLoaderBase.getResource("")
时可能出现的异常。 (markt)
Coyote
69607: 允许MD5初始化失败。基于Shivam Verma提交的代码。 (remm)
69614: 带有无效优先级字段值的HTTP/2优先级帧应被忽略。 (markt)
改进HTTP/2处理过程中意外错误的F处理。 (markt)
简化为启用HTTPS的连接器使用自定义SSLContext的过程。基于Hakky54提供的拉取请求 #805。 (markt)
Jasper
将JSP运行时库提供的自定义URL编码替换为调用 java.net.URLEncoder.encode()
。 (markt)
添加使用 Java Compiler
API的编译器,支持 exploded Web 应用。要使用的 compilerClassName
是 org.apache.jasper.compiler.JavaCompiler
。 (remm)
添加对将Java 25(值为 25
)指定为JSP编译的编译器源和/或编译器目标的支持。如果与不支持这些值的Eclipse JDT编译器版本一起使用,将记录警告并使用默认值。 (markt)
集群
修复 ReplicationValve
中跨上下文会话的重置问题。 (remm)
Web 应用
文档。添加指向Log4j文档的链接,该文档描述了如何使用Log4j而不是JULI进行Tomcat的内部日志记录。 (markt)
文档。记录通过请求或ServletContext可供Web应用使用的运行时属性。基于usmazat提供的拉取请求 #832。 (markt)
其他
将JSign恢复到6.0以避免文件锁定问题。 (markt)
更新到Eclipse JDT编译器4.35。 (markt)
更新到NSIS 3.11。 (markt)
更新到ByteBuddy 1.17.4。 (markt)
更新到Checkstyle 10.21.4。 (markt)
更新到SpotBugs 4.9.3。 (markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2025-03-05 Tomcat 11.0.5 (markt)
Catalina
当按资源名称查找类加载器资源时,资源名称不应以 '/' 开头。如果资源名称确实以 '/' 开头,Tomcat会宽松地将其视为没有 '/' 进行查找。当Web应用类加载器配置了外部仓库,并且查找使用了以 '/' 开头的名称时,缓存的“未找到”结果可能会有效地隐藏使用正确资源名称的查找结果。 (markt)
当JNDIRealm配置为使用GSSAPI认证时,使其能够验证提供给 HttpServletRequest.login(String username, String password)
的凭据。 (markt)
改进对CVE-2024-56337暴露和保护的检查,以便除非必要,否则不使用反射。已移除文件系统是否区分大小写的检查。 (markt)
修复JRE兼容性检测中的一个错误,该错误错误地将Java 19和Java 20识别为支持Java 21特性。 (markt)
添加对使用 AccessLogValve
和 ExtendedAccessLogValve
记录连接ID(由 ServletRequest.getServletConnection().getConnectionId()
返回)的支持。基于Dmole提供的拉取请求 #814。 (markt)
避免部分PUT使用的临时文件不被删除的情况。 (remm)
Coyote
69575: 如果响应已经使用 compress
、deflate
或 zstd
进行压缩,则避免再次使用压缩。 (remm)
如果客户端提交的 TE
头部包含 gzip
,则使用 Transfer-Encoding
进行压缩,而不是 Content-Encoding
。 (remm)
修复HTTP/2流重置处理中的竞态条件,该条件可能导致意外的500响应。 (markt)
集群
69598: 向 KubernetesMembershipProvider
实现添加服务账户令牌更改检测,并在令牌更改时重新加载。基于Miroslav Jezbera提供的补丁。 (markt)
其他
添加 makensis
作为在非Windows平台上构建Windows安装程序的一个选项。 (rjung/markt)
将Byte Buddy更新到1.17.1。 (markt)
将Checkstyle更新到10.21.3。 (markt)
将SpotBugs更新到4.9.1。 (markt)
将JSign更新到7.1。 (markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2025-02-17 Tomcat 11.0.4 (markt)
Catalina
69576: 避免由于针对CVE-2024-56337检查引入的未捕获异常导致 JreCompat
初始化失败。 (remm)
其他
添加 org.apache.juli.JsonFormatter
以将日志格式化为单行JSON文档。 (remm)
2025-02-10 Tomcat 11.0.3 (markt)
Catalina
在 DataSourcePropertyStore
上添加 tableName
配置,WebDAV Servlet可能会使用它。 (remm)
根据RFC 9110改进HTTP If头部的处理。基于Chenjp提供的拉取请求 #796。 (remm/markt)
允许在 Resources
元素上配置 readOnly
属性,并允许配置主资源的 readOnly
属性值。该属性值也将被默认和WebDAV Servlets使用。 (remm)
69285: 优化包含请求的参数映射创建。基于John Engebretson提供的示例代码和测试用例。 (markt)
69527: 避免缓存资源内容长度为0或立即被驱逐的罕见情况。 (remm)
修复WebDAV LOCK和PROPFIND尝试检测无正文请求时可能出现的边缘情况(如HTTP/1.0)。 (remm)
69528: 为 Resources
的 bloom
archiveIndexStrategy
添加多版本JAR支持。 (remm)
改进WebDAV servlet中对 WEB-INF
和 META-INF
的检查。基于Chenjp提交的补丁。 (remm)
从 CrawlerSessionManagerValve
中移除未使用的会话到客户端映射。由Brian Matzon提交。 (remm)
添加一项检查,以确保如果一个或多个Web应用可能容易受到CVE-2024-56337的攻击,则JVM已配置为防止该漏洞,如果未配置,则正确配置JVM。如果一个或多个Web应用可能容易受到CVE-2024-56337的攻击,并且JVM无法正确配置或无法确认JVM已正确配置,则阻止受影响的Web应用启动。 (markt)
当WebDAV servlet的 serveSubpathOnly
设置为 true
时,确保任何请求的WebDAV操作的目标也限制在子路径。 (markt)
当默认servlet因目标资源无法删除而对 DELETE
请求返回405(方法不允许)响应时,生成适当的 Allow
HTTP头部。拉取请求 #802 由Chenjp提供。 (markt)
重构 RequestDispatcher
实例的创建,使所提供路径的处理与正常请求处理一致。 (markt)
向Context添加 encodedReverseSolidusHandling
和 encodedSolidusHandling
属性,以控制用于创建 RequestDispatcher
的路径处理。 (markt)
处理在异步处理期间非容器线程上发生 IOException
后可能出现的 NullPointerException
。 (markt)
增强部分PUT使用的临时文件的生命周期。 (remm)
添加了通过新的 ParameterLimitValve
限制HTTP请求中参数数量的支持。该阀门允许对参数数量进行可配置的URL特定限制。 (dsoumis)
Coyote
对于Tomcat不支持的已注册HTTP/2设置,不再记录警告。这些设置现在被静默忽略。 (markt)
避免在回收 Http11InputBuffer
时罕见的 NullPointerException
。 (markt)
当处理NIO连接器的轮询器事件时,将记录无效套接字通道的日志级别降低到调试级别,因为这在正常使用中可能会发生。 (markt)
重构 SavedRequestInputFilter
,使缓冲数据直接使用而不是复制。 (markt)
将 org.apache.catalina.connector.InputBuffer
中未使用的缓冲区替换为静态的零长度缓冲区。 (markt)
请求处理完成后清除对HTTP/2流的引用,以帮助GC并减小HTTP/2回收请求和响应缓存的大小。 (markt)
添加一个新的连接器配置属性 encodedReverseSolidusHandling
,以控制URL中 %5c
序列的处理方式。默认行为不变(解码),请记住 allowBackslash 属性决定了解码URI的处理方式。 (markt)
69545: 改进 ChunkedInputFilter
的 available
方法的CRLF跳过。 (remm)
改进重复调用 getHeader()
的性能。拉取请求 #813 由Adwait Kumar Singh提供。 (markt)
69559: 确保JRE仅在使用代码时报告关于使用 sun.misc.Unsafe::invokeCleaner
的Java 24警告。 (markt)
Jasper
69508: 纠正对 69382 的修复中引入的回归,该回归导致如果页面属性和正文都包含参数,JSP include操作会中断。拉取请求 #803 由Chenjp提供。 (markt)
更新表达式语言解析器中的标识符验证,以反映自Java 9起, _
也是Java关键字,不能用作标识符。 (markt)
69521: 更新EL解析器,以允许EL标识符中Java语言规范定义的全部有效字符范围。 (markt)
69532: 优化 ExpressionFactory
实例的创建。补丁由John Engebretson提供。 (markt)
Web 应用
文档。扩展了将 mapperContextRootRedirectEnabled
和/或 mapperDirectoryRedirectEnabled
设置为 true
的安全隐患描述。 (markt)
文档。更好地记录 SSLHostConfig
元素的 truststoreProvider
属性的默认值。 (markt)
其他
更新到Commons Daemon 1.4.1。 (markt)
更新Jakarta EE的Tomcat迁移工具的打包版本到1.0.9。 (markt)
更新Commons Pool的内部分支到2.12.1。 (markt)
更新Byte Buddy到1.16.1。 (markt)
更新UnboundID到7.0.2。 (markt)
更新Checkstyle到10.21.2。 (markt)
更新SpotBugs到4.9.0。 (markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
leeyazhou提供了中文翻译的改进。 (markt)
2024-12-09 Tomcat 11.0.2 (markt)
Catalina
添加选项,允许WebDAV Servlet像DefaultServlet一样仅从子路径提供资源。 (michaelo)
在storeconfig中为 SSLHostConfig
的 protocols
属性添加特殊处理。 (remm)
69442: 修复解析请求参数时对 content-type
的大小写敏感检查。 (remm)
重构从 content-type
中提取媒体类型和子类型的重复代码,将其整合到一个方法中。 (markt)
生成的嵌入式代码与构造函数或属性相关方法抛出受检异常的组件的兼容性。 (remm)
之前对并发读写期间资源元数据不一致的修复不完整。 (markt)
#780: 修复 content-range
头部长度。由Chenjp提交。 (remm)
69444: 确保当调用应用程序定义的错误页面时,设置 jakarta.servlet.error.message
请求属性。 (markt)
避免状态servlet生成的JSON中数值带有引号。 (remm)
为WebDAV和默认servlet添加强ETag支持,可通过将 useStrongETags
初始化参数设置为 true
来启用。生成的ETag将是资源内容的SHA-1校验和。 (remm)
对目录列表使用客户端区域设置。 (remm)
69439: 改进 ExpiresFilter
中多个 Cache-Control
头部的处理。基于Chenjp提供的拉取请求 #777。 (markt)
69447: 更新Web应用类加载器无法找到的类缓存支持,以考虑从外部仓库加载的类。在此修复之前,这些类可能会被错误地标记为未找到。 (markt)
69466: 重做HEAD请求的处理。用户明确设置的头部不会被移除,HEAD请求中存在的任何头部也将在等效的GET请求中存在。根据RFC 9110,第9.3.2节,GET请求中可能存在一些头部,而等效的HEAD请求中不存在。 (markt)
69471: 将 ApplicationDispatcher.invoke()
捕获的 CloseNowException
实例记录在调试级别而不是错误级别,因为它们很可能是由客户端断开连接或类似的I/O问题引起的。 (markt)
为 69442 的修复添加一个测试用例。同时重构对 application/x-www-form-urlencoded
的引用。基于Chenjp提供的拉取请求 #779。 (markt)
69476: 在 DefaultServlet
中尝试报告PUT失败时捕获可能的ISE。 (remm)
在 RateLimitFilter
中添加对 HTTP的RateLimit头部字段(草案) 的支持。基于Chenjp提供的拉取请求 #775。 (markt)
69478: 纠正11.0.0-M19中引入的回归,该回归意味着当为cookie调用 setHttpOnly(boolean)
或 setSecure(boolean)
时,无论传递给方法的值是什么,相应的标志都会被设置。 (markt)
#787: 添加针对 69478 的回归测试。拉取请求由Thomas Krisch提供。 (markt)
当两个或多个请求范围重叠时,默认servlet现在会拒绝HTTP范围请求。基于Chenjp提供的拉取请求 #782。 (markt)
增强默认servlet处理的部分PUT请求的Content-Range验证。由Chenjp在拉取请求 #778 中提供。 (markt)
统一全局资源中的 DataSourceStore
查找,以可选地避免通常在那里不使用的 comp/env
前缀。 (remm)
根据RFC 9110的要求,HTTP Range
头部现在只对 GET
请求进行处理。基于Chenjp提供的拉取请求 #790。 (markt)
弃用默认servlet的 useAcceptRanges
初始化参数。它将在Tomcat 12及更高版本中移除,届时它将有效地硬编码为 true
。 (markt)
为 WebdavServlet
添加基于 DataSource
的属性存储。 (remm)
Coyote
使 encodedSolidusHandling
与Servlet规范对齐。如果使用直通模式,任何 %25
序列现在也将被直通,以避免应用程序解码路径时出现错误和/或损坏。 (markt)
Jasper
进一步优化EL对方法参数的评估。补丁由Paolo B.提供。 (markt)
对 69381 修复的后续。将表达式语言中方法查找性能的优化应用于额外位置。 (markt)
Web 应用
文档。移除对 ResourceParams
元素的引用。对 ResourceParams
的支持已在Tomcat 5.5.x中移除。 (markt)
文档。 69477: 修正 RemoteIPFilter
属性名称。该属性是 internalProxies
而不是 allowedInternalProxies
。拉取请求 #786 由Jorge Díaz提供。 (markt)
示例。修复当Servlet请求信息示例通过包含pathInfo组件的URL调用时断开的链接。 (markt)
示例。将请求头示例中会话cookie值的混淆扩展到JSON响应。 (markt)
示例。在servlet会话示例中添加删除会话属性的功能。 (markt)
示例。为servlet会话示例添加每个会话10个属性的硬编码限制。 (markt)
示例。为JSP表单认证示例添加删除会话属性的功能和每个会话10个属性的硬编码限制。 (markt)
示例。限制购物车示例只允许添加预定义项目到购物车。 (markt)
示例。移除JSP日历示例。 (markt)
其他
69465: 修复使用Tomcat嵌入式JAR进行原生镜像编译时的警告。 (markt)
将Tomcat的Commons DBCP分支更新到2.13.0。 (markt)
将EasyMock更新到5.5.0。 (markt)
将Checkstyle更新到10.20.2。 (markt)
将BND更新到7.1.0。 (markt)
更新到Eclipse JDT编译器4.34。 (markt)
改进了法语翻译。 (remm)
改进了韩语翻译。 (markt)
改进了中文翻译。 (markt)
tak7iji提供了日语翻译的改进。 (markt)
2024-11-10 Tomcat 11.0.1 (markt)
Catalina
添加对新的Servlet API方法 HttpServletResponse.sendEarlyHints()
的支持。 (markt)
55470: 添加调试日志记录,报告在digester或Web应用类加载器中发生 ClassNotFoundException
时的类路径。基于Ralf Hauser提供的补丁。 (markt)
69374: 在 DefaultServlet
的列表中正确区分表头和表体。 (michaelo)
69373: 改进 DefaultServlet
的HTML列表文件中最后修改日期的渲染(更灵活)。 (michaelo)
改进 DefaultServlet
的HTML输出。 (michaelo)
重构 RateLimitFilter
以使用 FilterBase
作为基类。这样做主要优点是处理 init-param
值的代码更少。 (markt)
69370: DefaultServlet
的HTML列表使用了不正确的标签。 (michaelo)
避免 CrawlerSessionManagerValve
在部分映射请求中出现NPE。 (remm)
锁定文件夹时,在响应中添加缺失的WebDAV Lock-Token
头部。 (remm)
无效的WebDAV锁定请求应以400拒绝。 (remm)
修复WebDAV在尝试解锁集合时的回归问题。 (remm)
验证WebDAV复制操作的目标未被锁定。 (remm)
对包含请求正文的WebDAV MKCOL
操作发送415响应,因为这是可选且不支持的。 (remm)
对WebDAV XML元素强制执行 DAV:
命名空间。 (remm)
如果父集合被锁定,则不允许对子资源进行新的WebDAV锁定(RFC 4918 第6.1节)。 (remm)
WebDAV DELETE
应该移除成功删除资源上的任何现有锁。 (remm)
根据RFC 4918 第7.3节和附录D,移除WebDAV空锁支持。现在,对不存在资源的锁定将创建一个用常规锁锁定的空文件。 (remm)
重写WebDAV共享锁的实现,以符合RFC 4918。 (remm)
使用Apache Jackrabbit项目中的代码实现WebDAV If
头部。 (remm)
在WebDAV Servlet中添加 PropertyStore
接口,以允许实现死属性存储。可以通过指定存储的类名来使用WebDAV servlet的 propertyStore
init参数配置所使用的存储。如果未配置自定义存储,则使用简单的非持久性实现。 (remm)
使用新添加的 PropertyStore
实现WebDAV PROPPATCH
方法,并更新 PROPFIND
以支持它。 (remm)
搜索Web应用类加载器资源时缓存未找到的结果。这解决了由诸如 java.sql.DriverManager
之类的组件引起的性能问题,在某些情况下,这些组件会重复搜索同一类。在大型Web应用中,这可能导致性能问题。缓存大小可以通过StandardContext上的新 notFoundClassResourceCacheSize
控制。 (markt)
INITIALIZED
状态后停止应为无操作,因为子组件在初始化后可能处于 FAILED
状态。 (remm)
修复当对同一资源存在并发 PUT
和 DELETE
请求时,Web资源缓存大小计算不正确的问题。 (markt)
为Web资源缓存添加调试日志记录,以便在添加和移除资源时跟踪当前大小。 (markt)
根据RFC 4918的建议,将旧的WebDAV opaquelocktoken:
方案替换为 urn:uuid:
用于锁令牌,并移除 secret
初始化参数。 (remm)
对同一路径的并发读写(例如 GET
和 PUT
/ DELETE
)导致 FileResource
损坏,其中某些字段被设置为文件存在,而另一些则设置为文件不存在。这导致了元数据不一致。 (markt)
69415: 确保 ExpiresFilter
仅在 GET
和 HEAD
请求上设置缓存头部。同时跳过应用程序已设置 Cache-Control: no-store
的请求。 (markt)
69419: 改进在存在多层嵌套包含时 ServletRequest.getAttribute()
的性能。基于John Engebretson提供的补丁。 (markt)
69426: 恢复为 Class.getProtectionDomain().getCodeSource().getLocation()
提供一个值(而不是null),因为许多库和JRE特性即使在不使用SecurityManager时也依赖于此值为非null。 (markt)
所有应用程序通过调用 HttpServletResponse.sendError()
并设置状态码103来发送早期提示信息响应。 (schultz)
Coyote
SSL实现返回零长度字节数组时,返回null SSL会话ID。 (remm)
跳过带有BoringSSL的OpenSSLConf,因为它不受支持。 (remm)
使OpenSSLEngine的缓冲区重用与tomcat-native的FFM代码对齐。 (remm)
如果 Http11Processor
中不存在 HttpParser
,则在其内部创建,以提高常规HTTP/1.1的生命周期健壮性。此新行为是在之前的重构中引入的,旨在改善HTTP/2性能。 (remm)
如果 init
方法中出现已知问题,OpenSSLContext
现在将抛出 KeyManagementException
,这与 javax.net.ssl.SSLContext.init
文档中的行为一致。这使得错误处理更加一致。 (remm)
Jasper
69399: 修复由改进 69333 引起的回归,该回归导致在使用标签池时调用标签 release
,而在不使用时跳过。补丁由Michal Sobkiewicz提交。 (remm)
69381: 改进表达式语言中方法查找的性能。当所需方法没有参数时,无需考虑类型转换或强制转换,方法查找过程可以简化。基于John Engebretson提供的拉取请求 #770。 (markt)
69382: 通过在生成的代码中重用相对昂贵的方法调用的结果而不是重复它们来提高JSP include操作的性能。补丁由John Engebretson提供。 (markt)
69398: 避免 PageContextImpl
中不必要的对象分配。基于John Engebretson的建议。 (markt)
69406: 当使用 StringInterpreterEnum
时,遇到无效的 Enum
时不要抛出 IllegalArgumentException
。相反,在运行时解析该值。补丁由John Engebretson提供。 (markt)
69429: 优化EL对不接受任何参数的方法的方法参数评估。补丁由John Engebretson提供。 (markt)
其他
将代码签名从DigiCert ONE切换到ssl.com eSigner。 (markt)
将Byte Buddy更新到1.15.10。 (markt)
将CheckStyle更新到10.20.0。 (markt)
改进了德语翻译。 (remm)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2024-10-09 Tomcat 11.0.0 (markt)
Catalina
确保当通过 registerServerAuthModule()
配置Jakarta认证模块时,调用 ServerAuthModule.initialize()
。 (markt)
确保Jakarta认证 CallbackHandler
在 Subject
中只创建一个 GenericPrincipal
。 (markt)
如果Jakarta认证过程因异常失败,明确将HTTP响应状态设置为500,因为 ServerAuthContext
可能未设置它。 (markt)
当持久化Jakarta认证提供者配置时,创建任何尚不存在的必要父目录。 (markt)
修正用于检测与持久化Jakarta认证提供者配置相关的临时文件删除时错误的逻辑。 (markt)
在处理Jakarta认证回调时,如果 CallerPrincipalCallback
未提供Principal,不要用 null
覆盖从 PasswordValidationCallback
获取的Principal。 (markt)
避免每秒存储一次以上配置时配置备份丢失。 (remm)
69359: WebdavServlet
从超类复制了 getRelativePath()
方法,但Javadoc不正确。 (michaelo)
69360: WebdavServlet
和 DefaultServlet
之间 DELETE
行为不一致。 (michaelo)
当不允许删除资源时,使 WebdavServlet
正确返回 Allow
头部。 (michaelo)
如果WebDAV Servlet使用了非通配符映射,则添加日志警告。 (remm)
69361: 确保WebDAV多状态响应中的条目顺序与资源处理的顺序一致。 (markt)
69362: 当通过WebDAV删除集合失败时,提供更好的多状态响应。现在,响应中将包含无法删除的空目录。 (markt)
69363: 在WebDAV servlet中一致使用 getPathPrefix()
,以确保当WebDAV servlet挂载在Web应用内的子路径时,使用正确的路径。 (markt)
Coyote
69316: 确保 FastHttpDateFormat#getCurrentDate()
(用于生成HTTP响应的Date头部)为给定输入生成正确的字符串。在此更改之前,在某些情况下输出可能会错一秒。拉取请求 #751 由Chenjp提供。 (markt)
对于前面有大量空白行的HTTP/1.1请求,请求开始时间可能未准确记录。 (markt)
将 server
和 serverRemoveAppProvidedValues
添加到HTTP/2协议将从其嵌套的HTTP/1.1连接器继承的属性列表中。 (markt)
避免在使用Apache Tomcat Native时可能发生的崩溃,该崩溃由APR终止后通过GC销毁SSLContext对象引起。 (remm)
改进HTTP/2对请求尾部字段的处理。尾部字段不再需要在后续流的头部之前接收,如果连接器在接收尾部字段之前暂停,进行中的流的尾部字段也不会被吞噬。 (markt)
确保在处理传入HTTP/2帧期间检测到流级别错误时,HTTP/2流的请求和响应不会过早回收。这可能导致访问日志中出现不正确的处理时间。 (markt)
Jasper
69333: 从生成的JSP中移除不必要的代码。 (markt)
69338: 改进处理包含两个以上操作数的AND或OR操作的表达式以及使用 not empty
的表达式的性能。 (markt)
69348: 通过对用于跟踪lambda参数的数据结构使用延迟初始化来减少 ELContext
中的内存消耗。 (markt)
Web 应用
当使用OpenSSL时,管理器Web应用现在将能够再次访问证书。 (remm)
其他
更新到Eclipse JDT编译器4.33。 (markt)
将Byte Buddy更新到1.15.3。 (markt)
将CheckStyle更新到10.18.2。 (markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
Ch_jp提供了中文翻译的改进。 (markt)
2024-09-16 Tomcat 11.0.0-M26 (markt)
Coyote
修复 69320,这是对 69302 修复中的一个回归,意味着一旦任何客户端发送HTTP/2重置帧,所有客户端的HTTP/2处理都可能中断。 (markt)
2024-09-10 Tomcat 11.0.0-M25 (markt)
Catalina
实施Jakarta Servlet项目最近的澄清:如果声明了内容长度,那么在响应中写入了那么多字节后,进一步的写入应该触发 IOException
。 (markt)
改进 ApplicationHttpRequest.parseParameters()
的性能。基于John Engebretson提供的示例代码和测试用例。 (markt)
Coyote
纠正对分块请求体非阻塞读取修复中的回归,该回归导致在没有数据可读时 InputStream.available()
返回非零值。在某些情况下,这可能导致阻塞读取等待更多数据而不是返回已接收的数据。 (markt)
为 Rfc6265CookieProcessor
添加一个新的属性 cookiesWithoutEquals
。默认行为不变。 (markt)
确保当使用 OpenSSLImplementation
时,Tomcat在收到客户端的TLS close_notify消息后发送TLS close_notify消息。 (markt)
69301: 修复在将响应头部写入访问日志时,尾部头部替换非尾部头部的问题。基于hypnoce提供的补丁和测试用例。 (markt)
69302: 如果HTTP/2客户端在请求正文完全写入之前重置流,确保通过调用 ReadListener.onErrror()
通知任何 ReadListener
。 (markt)
Jasper
将 TldScanner
恢复为在调试级别而不是跟踪级别记录详细扫描结果。 (markt)
简化 OptionalELResolver
的实现。 (markt)
WebSocket
如果阻塞消息写入超出超时,在抛出异常之前不要再次尝试写入。 (markt)
在消息处理期间(例如在用 @onMessage
注解的方法中)抛出的异常不应自动导致连接关闭。应用程序应处理异常并决定是否关闭连接。 (markt)
Web 应用
文档。使日志配置文档与当前默认值对齐。 (markt)
jdbc-pool
69255: 纠正对 69206 修复中的回归,该回归意味着执行语句的异常被包装在 java.lang.reflect.UndeclaredThrowableException
中,而不是应用程序看到原始的 SQLException
。由Michael Clarke提供的拉取请求 #744 修复。 (markt)
69279: 纠正对 69206 修复中的回归,该回归意味着以前返回 null
ResultSet
的方法现在返回一个带有null代理的代理。由Huub de Beer提供的拉取请求 #745 修复。 (markt)
其他
默认情况下将 tomcat-coyote-ffm.jar
从JAR扫描中排除。 (markt)
将默认日志处理程序级别更改为 ALL
,这样如果日志记录器配置为使用跟踪(FINEST
)级别日志记录,则日志消息默认不会被丢弃。 (markt)
将Hamcrest更新到3.0。 (markt)
将EasyMock更新到5.4.0。 (markt)
将Byte Buddy更新到1.15.0。 (markt)
将CheckStyle更新到10.18.0。 (markt)
将Apache Commons BCEL的内部分支更新到6.10.0。 (markt)
Fernando提供了西班牙语翻译的改进。 (markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2024-08-06 Tomcat 11.0.0-M24 (markt)
Catalina
69234: 修复由于重构使用 java.net.URI
而不是 java.net.URL
导致的回归,该回归破坏了对WAR文件并行部署的支持。 (markt)
Coyote
纠正在重构中添加coyote请求和响应回收以用于HTTP/2处理的回归。 (markt)
未发布 Tomcat 11.0.0-M23 (markt)
Catalina
添加对RFC 8297(早期提示)的支持。应用程序可以通过将 HttpServletResponse
转换为 org.apache.catalina.connector.Reponse
,然后调用方法 void sendEarlyHints()
来使用此功能。此方法将在Servlet 6.2及更高版本中添加到Servlet API(消除强制转换的需要)。 (markt)
69214: 不要拒绝使用POST但不包含 content-type
头部的CORS请求。Tomcat现在正确地将其作为简单CORS请求处理。基于thebluemountain建议的补丁。 (markt)
重构 SpnegoAuthenticator
,使其在可用时使用 Subject.callAs()
而不是 Subject.doAs()
。 (markt)
Coyote
添加FFM兼容方法以支持LibreSSL。目前不支持重新协商。 (remm)
添加 org.apache.tomcat.util.openssl.LIBRARY_NAME
(指定要加载的库名称)和 org.apache.tomcat.util.openssl.USE_SYSTEM_LOAD_LIBRARY
(设置为 true
以使用 System.loadLibrary
而不是FFM库加载代码),以配置使用FFM加载OpenSSL库。 (remm)
添加FFM兼容方法以支持BoringSSL。在许多情况下不支持重新协商。 (remm)
确保仅在有请求正文可读取时才创建HTTP/2流输入缓冲区。 (markt)
重构HttpParser实例的创建,从处理器级别移至协议级别,因为解析器配置取决于协议,并且解析器本身是无状态的。 (markt)
将 HTTP/2 与 HTTP/1.1 对齐,并默认回收容器内部请求和响应处理对象。此行为可通过 HTTP/2 升级协议上的新 discardRequestsAndResponses
属性进行控制。(markt)
jdbc-pool
69206: 确保从 Statement
方法 executeQuery()
、getResultSet()
和 getGeneratedKeys()
返回的语句在返回给调用者之前被正确封装。基于 Michael Clarke 提供的拉取请求 #742。
其他
修复了在添加 test-only
构建目标后,缺少 osgi 信息导致的打包回归。(remm)
更新 Tomcat Native 到 2.0.8。(markt)
更新 Byte Buddy 到 1.14.18。(markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2024-07-05 Tomcat 11.0.0-M22 (markt)
Catalina
允许 JAASRealm
使用配置源加载配置的 configFile
,以便于测试。(remm)
修复了当 setCharacterEncoding(Charset)
调用 null
时,扩展 ServletResponse
的类中可能出现的 NullPointerException
。(markt)
为 JAASCallbackHandler
添加缺失的算法回调。(remm)
在 APR 和 OpenSSL 状态类上添加 OpenSSL 版本号。(remm)
69131: 扩展 Authenticator 属性 allowCorsPreflight
的 filter
值实现,使其适用于所有与 CORS 过滤器配置的 URL 模式匹配的请求,而不仅仅在 CORS 过滤器映射到 /*
时才适用。(markt)
Coyote
改进了用于识别在连接器监听所有本地地址时解锁接受器线程的 IP 地址的算法。现在会跳过配置为点对点连接或当前未启用的接口。(markt)
在 FFM 代码处理 OpenSSL conf 命令之前,清理并记录 OpenSSL 错误。(remm)
69121: 确保如果 AsyncListener.onError()
分派到一个抛出异常的目标,则会触发 onComplete()
事件。(markt)
在尾部头字段重构之后,-1
不再是 maxTrailerSize
的允许值。相应地调整了文档。(remm)
将使用 FFM 的 OpenSSL 支持移至一个名为 tomcat-coyote-ffm.jar
的独立 JAR 包,该 JAR 包在其清单中声明支持 Java 22。(remm)
修复了在 Mac OS 上使用 FFM 搜索 OpenSSL 库时,无法搜索 java.library.path
的问题。(markt)
Jasper
更新了 jakarta.el.ImportHandler
中的优化,使其能识别 Java 23 中添加到 java.lang
包的新类。(markt)
确保当使用 ExpressionFactory.coerceToType()
将对象强制转换为 String 时,toString()
中的异常仍会导致 ELException
。(markt)
添加了支持指定 Java 24 (值为 24
) 作为 JSP 编译的编译器源和/或编译器目标。如果与不支持这些值的 Eclipse JDT 编译器版本一起使用,则会记录警告并使用默认值。(markt)
69135: 在 JAR 文件中打包的标签文件中使用 include 指令时,确保正确处理上下文相对的 include。(markt)
69135: 在 JAR 文件中打包的标签文件中使用 include 指令时,确保正确处理文件相对的 include。(markt)
69135: 在 JAR 文件中打包的标签文件中使用 include 指令时,确保文件相对的 include 不允许访问 /META_INF/tags/
目录之外或 JAR 文件之外的文件。(markt)
Web 应用
修复了使用自动端口时连接器状态 Servlet 详细视图的问题。(remm)
其他
添加 test-only
构建目标,允许仅运行测试套件,支持最低 Java 版本以运行 Tomcat。(rjung)
更新 Eclipse JDT 编译器到 4.32。(markt)
更新 UnboundID 到 7.0.1。(markt)
更新 SpotBugs 到 4.8.6。(markt)
移除 cglib 依赖,因为 EasyMock 的单元测试版本不需要它。(markt)
更新 EasyMock 到 5.3.0。这增加了对 Byte-Buddy 1.14.17 的测试依赖。(markt)
Vladimír Chlup 改进了捷克语翻译。(markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
fangzheng 改进了中文翻译。(markt)
2024-06-18 Tomcat 11.0.0-M21 (markt)
Catalina
使用 WebDAV 时,添加了对浅拷贝的支持。(markt)
移除 WebdavFixFilter
,因为它不再需要。(markt)
69066: 修复了 SPNEGO 认证器在处理 Base64 时出现的回归问题。由 Daniel Lyko 提交。(remm)
添加 RealmBase.getPrincipal(GSSName, GSSCredential, GSSContext)
用于从已建立的 GSS 上下文中检索扩展/额外信息。(michaelo)
纠正了 68721 修复中的回归,该回归导致某些 LinkageError
实例被报告为 ClassNotFoundException
。(markt)
确保当上下文配置为使用布隆过滤器时,通过 JAR 文件部署的静态资源仍然可访问。基于 bergander 提供的拉取请求 #730。(markt)
引入引用计数,使 AprLifecycleListener
更加健壮。这尤其针对具有多个独立生命周期服务器实例的更复杂嵌入式配置,其中一个以上服务器实例需要 AprLifecycleListener
。(markt)
Coyote
修复 OpenSSL FFM 使用 ERR_error_string 带有 128 字节缓冲区的问题,并改用 ERR_error_string_n。(remm)
修复了在 Windows 上设置 CA 证书到 null 路径时崩溃的问题。(remm)
69068: 确保在使用 HTTP/2 时,异步非阻塞读取会触发读取超时。(markt)
69133: 在 Connector
元素上添加任务队列大小配置,与 Executor
元素类似,以保持一致性。(remm)
使每个连接的活动 HTTP/2 流计数更加健壮。(markt)
添加了对 TLS 1.3 客户端发起重密钥的支持。(markt)
Jasper
68546: 对 JSP 生成的 Servlet 代码的初始加载进行小幅额外优化。基于 Dan Armstrong 的建议。(markt)
Web 应用
添加了为 Manager Web 应用程序主页设置副标题的功能。这旨在允许拥有大量实例的用户轻松区分它们。基于 Simon Arame 提供的拉取请求 #724。(markt)
其他
将 Derby 恢复到 10.16.1.1,因为这是在 Java 17 上运行的最新 Derby 版本。(markt)
更新 Commons Daemon 到 1.4.0。(markt)
更新 Jakarta Annotations API 到 3.0。(markt)
更新 Jakarta Authentication API 到 3.1。(markt)
更新 Objenesis 到 3.4。(markt)
更新 Checkstyle 到 10.17.0。(markt)
更新 SpotBugs 到 4.8.5。(markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2024-05-08 Tomcat 11.0.0-M20 (markt)
Catalina
从会话管理器中弃用并移除 sessionCounter
(已由活动会话计数和过期会话计数代替,作为合理近似)和 duplicates
(在当前实现中不表示可能发生的事件)统计数据。(remm)
68890 将 Manager webapp 中 JSP 的输出编码与这些文件中 XML 声明对齐。(schultz)
更新基本认证以实现 RFC 7617 的要求,包括移除 trimCredentials
设置,该设置现在硬编码为 false
。(markt)
记录没有值的 cookie 时的小性能优化。(schultz)
更正异步请求的错误处理。如果应用程序在 AsyncListener.onError()
期间执行分派,则现在执行分派而不是使用错误页面机制完成请求。(markt)
重新调整 AbstractAccessLogValve 中的 ElapsedTimeElement 以使用可自定义的样式。(schultz)
为 AccessLogValve 和 ExtendedAccessLogValve 添加更多时间刻度选项。允许时间刻度应用于 ExtendedAccessLogValve 中的 "time-taken" 令牌。(schultz)
修复 WebDAV 锁空(对不存在资源的锁)线程安全和移除问题。(remm)
添加对 WebDAV 锁过期进行定期检查。(remm)
扩展 Asn1Parser
以解析 UTF8String
。(michaelo)
移除已移除属性的 MBean 元数据。基于 Shawn Q. 提供的拉取请求 #719。(markt)
从 Manager.rotateSessionId()
中移除重复的 ID 检查。(markt)
Coyote
将 OpenSSL FFM 类添加到 tomcat-embed-core.jar
。(remm)
使非安全写入和安全写入与 NIO 对齐,并在没有字节可写入时跳过写入尝试。(markt)
允许 socket.unlockTimeout
的任何正值。如果配置为负值或零值,将使用默认值 250ms
。(mark)
减少等待连接器解锁的时间。之前的默认值 10 秒对于解锁失败的情况明显过长。等待时间现在为 100 毫秒加上两倍的 socket.unlockTimeout
。(markt)
确保当请求体使用分块编码并使用非阻塞 IO 读取时,会触发 onAllDataRead()
事件。(markt)
68934: 当超过 maxConnections
时,在锁存对象中添加调试日志。(remm)
重构尾部字段处理以使用 MimeHeaders
实例存储尾部字段。(markt)
确保正确处理同一尾部字段的多个实例。(markt)
修复分块请求体的非阻塞读取。(markt)
重构 HTTP 头部解析以使用通用解析代码。(markt)
当无效的 HTTP 响应头被丢弃时,一个差一错误意味着响应中的第一个头也被丢弃。修复基于 foremans 提供的拉取请求 #710。(markt)
Jasper
添加了支持指定 Java 23 (值为 23
) 作为 JSP 编译的编译器源和/或编译器目标。如果与不支持这些值的 Eclipse JDT 编译器版本一起使用,则会记录警告并使用默认值。(markt)
WebSocket
68884: 当写入 WebSocket 关闭消息进行异常关闭时,减少写入超时。超时默认为 50 毫秒,可通过 WebSocket 会话相关联的用户属性集合中的 org.apache.tomcat.websocket.ABNORMAL_SESSION_CLOSE_SEND_TIMEOUT
属性进行控制。(markt)
Web 应用
示例:当多个客户端同时断开连接时,提高 WebSocket 聊天应用程序的性能。(markt)
示例:增加使用 WebSocket 聊天应用程序时显示的历史消息数量。(markt)
示例:当多个客户端同时断开连接时,提高 WebSocket 贪吃蛇应用程序的性能。(markt)
其他
切换到使用 JRE 提供的 Base64 编码器和解码器,而不是 Commons Codec 提供的版本。这移除了 Commons Codec 的内部分支。(markt)
更新 Eclipse JDT 编译器到 4.31。(markt)
更新 NSIS 到 3.10。(mark0t)
更新 UnboundID 到 7.0.0。(markt)
更新 Checkstyle 到 10.16.0。(markt)
更新 JaCoCo 到 0.8.12。(markt)
更新 SpotBugs 到 4.8.4。(markt)
更新 Apache Commons BCEL 的内部分支到 6.9.0。(markt)
更新 Apache Commons DBCP 的内部分支到 2.12.0。(markt)
tak7iji 改进了日语翻译。(remm)
2024-04-16 Tomcat 11.0.0-M19 (remm)
Catalina
为 SemaphoreValve
添加 highConcurrencyStatus
属性,以选择性地允许阀门在无法从信号量获取许可时向客户端返回错误状态码。(remm)
在 SecurityListener 中添加对正在运行的 Tomcat 实例自构建日期以来的“年龄”检查,如果服务器过旧则记录警告。(schultz)
使用 AsyncContext
时,如果尝试在回收 AsyncContext
后使用它,则抛出 IllegalStateException
,而不是允许 NullPointerException
。(markt)
为 HttpSession.getAccessor()
添加默认实现,以与 Servlet 6.1 API 对齐。(markt)
添加 Jakarta EE 11 XML schema 并更新 Tomcat 和包含的 Web 应用程序以使用它们。(markt)
将保护 StandardServer.services 的线程安全机制从简单的同步锁更改为 ReentrantReadWriteLock,以允许多个读取器同时操作。基于 Markus Wolfe 的建议。(schultz)
改进 Service 连接器、Container 子级和 Service 执行器访问同步,使用 ReentrantReadWriteLock。(remm)
改进了如果尝试通过 Servlet API 上传文件且文件大于 Integer.MAX_VALUE
时整数溢出的处理。(markt)
68862: 处理读取错误时可能的响应提交。(remm)
Coyote
为端点添加 threadsMaxIdleTime
属性,以允许配置内部执行器缩减到配置的 minSpareThreads
大小之前的时间量。(remm)
调整 Rfc6265CookieProcessor
生成的 Set-Cookie
头部,以便值为空字符串的属性将输出为不带等号或值的裸属性名。这将通过消除特殊处理的需要来简化未来对类似新属性的支持。(markt)
重构 HttpOnly
和 Secure
属性的内部表示,以使用空字符串作为值,与最近对 Set-Cookie
头部生成的更改保持一致。(markt)
对于配置了 Max-Age
值为零的 cookie,不要为 Set-Cookie
头部生成 Max-Age
属性,因为 RFC 6265 不允许在此情况下值为零。(markt)
纠正了对用户提供的 SSLContext
实例支持中的回归,该回归导致 org.apache.catalina.security.TLSCertificateReloadListener
出现问题。(markt)
Jasper
处理 JSP 引擎将请求/响应转发给使用 OutputStream
而不是 Writer
的 Servlet 的情况。这曾在后续尝试获取 Writer
的代码路径上触发 IllegalStateException
。(markt)
正确处理标签库打包在 JAR 文件中且 Web 应用程序部署为 WAR 文件而非解压目录的情况。(markt)
如果应用程序使用自定义 XMLInputFactory,则防止 JSP 编译器锁定 Web 应用程序的 ClassLoader。基于 Simon Niederberger 的建议。(schultz)
其他
更新 Checkstyle 到 10.14.1。(markt)
更新 Apache Commons BCEL 的内部分支到 6.8.2。(markt)
更新 Apache Commons Codec 的内部分支到 1.16.1。(markt)
改进了法语翻译。 (remm)
tak7iji 改进了日语翻译。(remm)
leeyazhou 改进了中文翻译。(remm)
2024-03-14 Tomcat 11.0.0-M18 (markt)
通用
将支持的最低 Java 版本降低到 Java 17。(markt)
Catalina
改进构建过滤器链的次要性能。基于 Luke Miao 在拉取请求 #702 中的想法。(remm)
对齐 Writer
和 OutputStream
的错误处理。确保一旦响应被回收,使用其中任何一个都会触发 NullPointerException
,前提是 discardFacades
配置为默认值 true
。(markt)
68692: 使用 Executor
元素配置的标准线程池实现现在实现了 ExecutorService
,以更好地支持 NIO2。org.apache.catalina.Executor
接口现在扩展了 ExecutorService
。(remm)
68495: 在成功进行 FORM 认证后恢复保存的 POST 请求时,确保在恢复请求体时 URI、查询字符串或协议均未损坏。(markt)
转发请求后,尝试解包响应以挂起它,而不是在响应被包装时简单地关闭它。在 Context
上添加了一个新的 suspendWrappedResponseAfterForward
布尔属性来控制此行为,默认值为 true
。(remm)
68721: 解决使用 ClassFileTransformer
时可能导致重复类定义的问题,即类的转换也会触发同一类的加载。(markt)
如果输出与输入相同,则重写阀门不应进行重写。(remm)
为重写阀门添加了一个新的 valveSkip
(或 VS
) 规则标志,以允许跳过 Catalina 管道中的下一个阀门。(remm)
Coyote
修复 OpenSSL FFM 代码中错误的符号查找使用。(remm)
改进 HTTP/2 流优先级排序过程。如果流使用了所有连接窗口且仍有内容要写入,它现在将立即添加到积压中,而不是等待剩余内容的写入尝试。(markt)
Jasper
通过 jakarta.el.OptionalELResolver
为 java.util.Optional
添加方法调用支持到 Tomcat 的 Jakarta EL API 实现中,以与 Jakarta EL 6.0 API 的最新提案保持一致。属性支持也已进行了完善,以提高一致性。(markt)
compilerSourceVM
和 compilerTargetVM
的默认值已更新为 17,以与 Tomcat 11 所需的最低 Java 版本 Java 17 对齐。(markt)
集群
避免在异步时更新请求计数统计信息。(remm)
其他
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
57130: 允许 digest.(sh|bat) 从文件或 stdin 接受密码。(csutherl/schultz)
2024-02-19 Tomcat 11.0.0-M17 (markt)
Catalina
实现 HttpSession.getAccessor()
,它提供了一种机制,允许应用程序在标准 Servlet 处理 HTTP 请求之外与 HttpSession
交互。这对于使用 Jakarta WebSocket API 的应用程序特别有用。(markt)
通过移除 tomcat-embed-core.jar
中不再包含的 org.apache.catalina.ssi
包的引用,更正了 tomcat-embed-core.jar
的 JPMS 和 OSGi 元数据。基于 Jendrik Johannes 提供的拉取请求 #684。(markt)
修复 ServiceBindingPropertySource,使其在配置为移除属性值文件中的尾部 \r\n
序列时能正确移除。由 Coverity Scan 识别出的 Bug。(markt)
改进了 CSRF 防护过滤器,包括跳过为资源名称和子树 URL 模式添加随机数的功能。(schultz)
审查调试日志的使用,并将跟踪或数据转储操作从调试级别降级为跟踪级别。(remm)
68089: 进一步提高 ApplicationHttpRequest
和 ApplicationRequest
的请求属性访问性能。(markt)
68559: 允许异步错误处理在异步处理期间出现错误后写入响应。(markt)
Coyote
为 cookie 属性设置 null
值应移除该属性。(markt)
优化 OpenSSL 上下文回调与 FFM API 的状态处理。(remm)
使异步错误处理更加健壮。确保一旦连接被标记为关闭,进一步的异步处理不能改变此状态。(markt)
使异步错误处理更加健壮。确保一旦 AsyncListener.onError()
调用返回到容器,只有容器线程可以访问 AsyncContext
。这可以防止在应用程序线程继续访问 AsyncContext
时可能发生的各种竞争条件。
审查调试日志的使用,并将跟踪或数据转储操作从调试级别降级为跟踪级别。特别是,大多数 HTTP/2 调试日志已更改为跟踪级别。(remm)
添加了对在 SSLHostConfigCertificate
实例上配置的用户提供的 SSLContext
实例的支持。基于 Hakan Altındağ 提供的拉取请求 #673。(markt)
68558 的部分修复:缓存请求 URI、HTTP 头部名称和请求 Content-Type
值转换为 String
的结果,通过减少重复的 byte[]
到 String
转换来提高性能。(markt)
改进了 HTTP/2 客户端的错误报告,对于头部处理错误,在检测到错误的帧结束时报告问题,而不是在头部结束时报告。(markt)
一旦流被回收,就移除对流的剩余引用。这使得流更早地符合垃圾回收条件,从而提高可伸缩性。(markt)
Jasper
附加修复,以通过 ArrayELResolver
正确支持 length
作为数组的只读属性。(markt)
68546: 生成 JSP 导入映射的最佳大小和类型,如 John Engebretson 所建议。(remm)
审查调试日志的使用,并将跟踪或数据转储操作从调试级别降级为跟踪级别。(remm)
WebSocket
纠正了对 66508 的修复中存在的回归问题,该问题可能在某些情况下导致 UpgradeProcessor
泄漏。(markt)
审查调试日志的使用,并将跟踪或数据转储操作从调试级别降级为跟踪级别。(remm)
确保如果连接在服务器端使用了专有的挂起/恢复功能挂起时关闭,WebSocket 连接关闭能完成。(markt)
Web 应用
添加了示例应用程序 RequestHeaderExample 对 JSON 格式响应的支持。(schultz)
其他
更正了清单文件中剩余的 OSGi 契约引用,使其指向 Jakarta EE 契约名称而不是 Java EE 契约名称。基于 Paul A. Nicolucci 提供的拉取请求 #685。(markt)
更新 Checkstyle 到 10.13.0。(markt)
更新 JSign 到 6.0。(markt)
更新打包的 Tomcat Migration Tool for Jakarta EE 版本到 1.0.7。(markt)
更新 Tomcat Native 到 2.0.7。(markt)
添加调试级别消息的字符串。(remm)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2024-01-09 Tomcat 11.0.0-M16 (markt)
Catalina
允许默认 Servlet 通过 init 参数 directoryRedirectStatusCode
为目录重定向发布备用重定向状态码。(funkman/markt)
68378: 将全局 web.xml 中扩展到 MIME 类型的映射与 httpd 中的映射对齐,为 ggs
添加 application/vnd.geogebra.slides
,为 mjs
添加 text/javascript
,为 opus 添加 audio/ogg
。(markt)
Coyote
重构 VirtualThreadExecutor
,使其可由 NIO2 连接器使用,NIO2 连接器即使在配置为使用虚拟线程时也使用平台线程。(markt)
纠正了 67675 修复中的回归,该回归导致未指定显式伪随机函数并依赖默认值的 PKCS#8 格式密钥的 TLS 密钥文件解析失败。这通常影响由 OpenSSL 1.0.2 生成的密钥。(markt)
允许内省 mbean 上具有相同名称的多个操作,修复了引入第二个 addSslHostConfig
方法导致的回归。(remm)
放宽对 HTTP Host 头与请求行中使用的主机(如果有)一致性的检查,使检查不区分大小写,因为主机名不区分大小写。(markt)
68348: 添加对 cookie(包括会话 cookie)的分区属性的支持。(markt)
Jasper
compilerSourceVM
和 compilerTargetVM
的默认值已更新为 21,以与 Tomcat 11 所需的最低 Java 版本 Java 21 对齐。(markt)
Web 应用程序
68035: Manager 应用程序的额外修复,以启用部署位于 Host 的 appBase
中且由裸(无路径)WAR 或目录名(如文档所示)指定的 Web 应用程序。(markt)
其他
更新 Eclipse JDT 编译器到 4.30。(markt)
更新 Checkstyle 到 10.12.7。(markt)
更新 SpotBugs 到 4.8.3。(markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2023-12-12 Tomcat 11.0.0-M15 (markt)
Catalina
后台进程不应与容器的生命周期操作同时运行。(remm)
添加了对 Jakarta Servlet 6.1 中新增的 jakarta.servlet.request.secure_protocol
请求属性的支持。这取代了现在已弃用的 Tomcat 特定请求属性 org.apache.tomcat.util.net.secure_protocol_version
。(markt)
将行为与 Servlet 6.1 规范的最新添加保持一致,该规范要求所有 HTTP 错误分派都使用 GET 方法。(markt)
纠正了某些 WebDAV 响应中 XML 的意外转义。当响应 PROPFIND 请求时提供的支持锁的 XML 列表被错误地 XML 转义。(markt)
68227: 确保如果 AsyncListener.onError()
调用 AsyncContext.dispatch()
,则会调用 AsyncListener.onComplete()
。(markt)
68228: 如果在 HTTP 请求处理期间发生读取超时,则使用 408 状态码。包括一个基于 adwsingh 提供的代码的测试用例。(markt)
Coyote
使用 Java 代码通过 FFM API 加载证书链。(remm)
Jasper
68119: 重构 CompositeELResolver
以提高类型转换操作期间的性能。(markt)
Web 应用程序
示例。改进错误处理,以便与断开连接的用户关联的蛇从游戏中移除。(markt)
其他
更新 OWB 模块到 Apache OpenWebBeans 4.0.1。(remm)
68124: 将 sample.war 从 javax 迁移到 jakarta。(lihan)
更新 UnboundID 到 6.0.11。(markt)
更新 Checkstyle 到 10.12.5。(markt)
更新 SpotBugs 到 4.8.2。(markt)
更新 Derby 到 10.17.1。(markt)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
John William Vicente 改进了巴西葡萄牙语翻译。(markt)
usmazat 和 remm 改进了俄语翻译。(markt)
2023-11-15 Tomcat 11.0.0-M14 (markt)
Catalina
67667: TLSCertificateReloadListener
打印 X509Certificate#getNotAfter()
的不可读渲染。(michaelo)
Manager webapp 中包含的状态 servlet 现在可以使用 JSON=true
URL 参数以 JSON 格式输出统计信息。(remm)
选择性地允许 ServiceBindingPropertySource 从包含属性值的文件中去除尾部换行符。(schultz)
在 FarmWebDeployer 中使用 Files.move 而不是 File.renameTo,以支持更广泛的环境,并在失败时提供更好的信息。(schultz)
67793: 确保在 FORM 认证成功后,如果用户在 FORM 认证过程中刷新页面,原始会话超时时间会恢复。基于 Mircea Butmalai 的建议。(markt)
67926: PEMFile
打印 ASN.1 OID 的不可识别字符串表示。(michaelo)
66875: 确保设置请求属性 jakarta.servlet.error.exception
不足以触发当前请求和响应的错误处理。(markt)
68054: 避免 65433 修复引入的一些文件规范化调用。(remm)
68089: 提高 ApplicationHttpRequest
和 ApplicationRequest
的请求属性访问性能。(markt)
使用 400 状态码报告由于不良请求(例如无效的尾部头部)导致的错误,而不是 500 状态码。(markt)
确保在读取请求期间发生的 IOException
总是触发错误处理,无论应用程序是否吞噬异常。(markt)
Coyote
66670: 添加 SSLHostConfig#certificateKeyPasswordFile
和 SSLHostConfig#certificateKeystorePasswordFile
。(michaelo)
调用 SSLHostConfigCertificate.setCertificateKeystore(ks)
时,自动调用 setCertificateKeystoreType(ks.getType())
。(markt)
添加使用 FFM API 而非 Tomcat Native 的 OpenSSL 集成。当使用 Java 22(从预览版 build 20 开始)或更高版本时,可以通过在 Server
元素上添加 org.apache.catalina.core.OpenSSLLifecycleListener
监听器来启用 OpenSSL 支持。(remm)
67628: 澄清 SSLHostConfig
的 ciphers
属性的使用方式。(markt)
67666: 确保使用 PEM 文件的 TLS 连接器要么与 TLSCertificateReloadListener
配合使用,要么在极少数情况下不兼容时,在连接器启动时记录警告。(markt)
67675: 支持比 JVM 默认组合更广泛的 PEM 文件 KDF 和密码。特别是,支持 OpenSSL 默认的 HmacSHA256 和 DES-EDE3-CBC。(markt)
67927: 重新加载 TLS 配置可能导致连接器拒绝新连接或 JVM 崩溃。(markt)
67938: 纠正了导致 TLS 握手失败的大型 TLS 客户端 hello 消息的处理。(markt)
68026: 首次访问时将选定的 MessageByte
值转换为 String,以加速后续访问并减少垃圾回收。(markt)
Jasper
为表达式语言添加了对 Records 的支持。(markt)
68068: 提高 EL 性能。基于 John Engebretson 的建议。(markt)
WebSocket
更正 WebSocket 客户端 API JAR 文件 MANIFEST 中缺失的元数据。(markt)
Web 应用
68035: 纠正了 56248 修复中的回归问题,该问题阻止了通过 Manager 部署已存在于 appBase
中的 WAR 或目录,或已存在于 xmlBase
中的上下文文件。(markt)
其他
67538: 利用 Ant 的 <javaversion />
任务来强制执行最低 Java 构建版本。(michaelo)
更新 Checkstyle 到 10.12.4。(markt)
更新 JaCoCo 到 0.8.11。(markt)
更新 SpotBugs 到 4.8.0。(markt)
更新 BND 到 7.0.0。(markt)
2023-10-14 Tomcat 11.0.0-M13 (markt)
Coyote
67670: 修复代码重构后 HTTP 压缩的回归问题。(remm)
jdbc-pool
67664: 纠正了 11.0.0-M12 中清理不必要的完全限定类名使用时导致的 jdbc-pool 损坏的回归问题。(markt)
2023-10-10 Tomcat 11.0.0-M12 (markt)
Catalina
65770: 提供一个生命周期监听器,该监听器将在证书到期前固定时间自动重新加载 TLS 配置。这旨在与定期更新 TLS 证书的第三方工具一起使用。(markt)
修复部署时读取上下文描述符错误的处理。(remm)
修复了如果同时使用 qsa,重写规则 qsd(查询字符串丢弃)会被忽略的问题,而实际上它应该优先。(remm)
67472: 当 CORS 未实际启用时,发送较少的 CORS 相关头部。(schultz)
改进 recycle()
方法中的故障处理。(markt)
Coyote
67198: 确保在处理从代理服务器收到的 auth_type
属性时,AJP 连接器属性 tomcatAuthorization
优先于 tomcatAuthentication
属性。(markt)
67235: 修复 NullPointerException
,该异常在 AsyncListener
处理错误并进行分派而不是完成时发生。(markt)
当异步处理期间发生错误时,确保错误处理过程每个异步周期仅触发一次。(markt)
修复 IntropectionUtil 中尝试匹配无参数方法的逻辑问题。(remm)
改进 NIO2 端点中 readNotify 和 writeNotify 周围的线程安全性。(remm)
避免访问消息摘要映射时罕见的线程安全问题。(remm)
改进负载下升级连接的统计数据收集。(remm)
PushBuilder
已被弃用,以与 Servlet 6.1 规范的更改保持一致。它将在 Tomcat 11 的未来里程碑中替换为对 103 early hints 的支持。(markt)
移除对 HTTP/2 服务器推送的支持。调用 newPushBuilder()
将始终返回 null
。(markt)
使 HTTP 尾部字段的验证与标准字段对齐。(markt)
改进 HTTP/2 开销保护。(markt)
Jasper
67080: 提高 JSP 中使用隐式对象的 EL 表达式的性能。基于 John Engebretson、Anurag Dubey 和 Christopher Schultz 的建议。(markt)
其他
更新 Apache Commons FileUpload 的内部分支到 7a8c324 (2023-09-16, 1.x-SNAPSHOT)。由于 2.x 分支中需要额外 Commons IO 依赖的重大重构,Tomcat 已切换到跟踪 1.x 分支。(markt)
为所有 Tomcat JAR 的 JAR 清单添加 Bundle-License
头部。(markt)
更新 Eclipse JDT 编译器到 4.29。(markt)
更新 UnboundID 到 6.0.10。(markt)
更新 Checkstyle 到 10.12.3。(markt)
更新 Tomcat Native 到 2.0.6。(markt)
更新 Commons Pool 到 2.12.0。(markt)
67611: 更正 BUILDING.txt 中的下载链接。(lihan)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
usmazat 改进了俄语翻译。(markt)
2023-08-25 Tomcat 11.0.0-M11 (markt)
Catalina
如果应用程序或库同时设置了非 500 错误代码和 jakarta.servlet.error.exception
请求属性,则在错误页面处理期间使用提供的错误代码,而不是假定错误代码为 500。(markt)
更新代码注释和 Tomcat 输出,将 1024 * 1024 字节使用 MiB,将 1024 字节使用 KiB,而不是 MB 和 kB。(martk)
更新 HTTP 参数处理以与 Jakarta Servlet 6.1 API Javadoc 中用于获取请求参数的 ServletRequest
方法的更改对齐。无效参数和/或超出参数大小和/或数量限制现在会触发异常。因此,FailedRequestFilter
已被移除。(markt)
避免 FORM 认证中的协议相对重定向。(markt)
Web 应用
文档。更新文档以使用 MiB 表示 1024 * 1024 字节,使用 KiB 表示 1024 字节,而不是 MB 和 kB。(martk)
其他
改进了中文翻译。(lihan)
改进了法语翻译。 (remm)
tak7iji提供了日语翻译的改进。 (markt)
2023-08-14 Tomcat 11.0.0-M10 (markt)
Catalina
修复了 Coverity Scan 发现的 DataSourceUserDatabase
中潜在的数据库连接泄漏。(markt)
使 ExtendedAccessLogValve
模式的解析更加健壮。(markt)
修复了尝试持久化内部凭证处理程序配置时失败的问题。(remm)
66680: 在会话持久化过程中序列化会话时,不要记录 null Principal 不可序列化的警告。拉取请求 #638 由 tsryo 提供。(markt)
66822: 在日志消息中对连接器实例使用与关联的 ProtocolHandler 实例相同的命名格式。(markt)
如果首先解析部件,则部件计数也应降低用于解析参数的实际 maxParameterCount
。(remm)
Coyote
重构 NIO 连接器的阻塞读取和写入,以移除可能导致 Poller 通知遗漏从而导致超时而非预期读取或写入的代码路径。(markt)
重构等待 HTTP/2 流或连接窗口更新以处理等待期间的虚假唤醒。(markt)
改进套接字通道创建和 TLS 端点的可扩展性。拉取请求 #639 由 Marco Fargetta 提供。(remm)
纠正了 11.0.0-M9 中引入的回归,并在构造 SSLHostConfigCertificate
实例的 certificateKeystoreFile
属性的默认值时使用了错误的常量。(markt)
重构 HTTP/2 实现以在使用虚拟线程时减少锁定。(markt)
传递引用 OpenSSL 配置文件的密码,例如 PROFILE=SYSTEM
,而不是尝试解析它而产生错误。(remm)
66841: 确保在 HTTP/2 异步处理期间发生错误后调用 AsyncListener.onError()
。(markt)
66842: 使用异步 I/O(默认)时,在计算 HTTP/2 开销计数时包含 DATA 帧,以确保连接不会过早终止。(markt)
纠正了一个竞争条件,该条件可能导致在响应写入 HTTP/2 流后发送虚假的 RST 消息。(markt)
WebSocket
66681: 修复了使用 permessage-deflate
启用压缩时刷新批处理消息时出现的 NullPointerException
。(markt)
jdbc-pool
修复了当 testAllIdle 释放它们时 releaseIdleCounter
不递增的问题。拉取请求 #241 由 Arun Chaitanya Miriappalli 提供。(lihan)
修复了当写入时发生异常时,ConnectionState
状态会与连接的实际状态不一致的问题。拉取请求 #643 由 Wenjun Xiao 提供。(lihan)
其他
更新 NSIS 到 3.09。(markt)
更新 Checkstyle 到 10.12.2。(markt)
改进了法语翻译。 (remm)
tak7iji 和 Shirayuking 改进了日语翻译。(markt)
66829: 修复引用问题,以便用户在 Windows 上当 Java 可执行文件路径包含空格时,可以按预期使用 _RUNJAVA
环境变量。(markt)
66834: 更正清单文件中的 OSGi 契约引用,使其指向 Jakarta EE 契约名称而不是 Java EE 契约名称。(markt)
更新 Tomcat Native 到 2.0.5。(markt)
2023-07-10 Tomcat 11.0.0-M9 (markt)
其他
纠正 JSign 依赖项的属性。(rjung)
未发布 Tomcat 11.0.0-M8 (markt)
Catalina
59232: 添加 org.apache.catalina.core.ContextNamingInfoListener
,一个创建上下文命名信息环境条目的监听器。(michaelo)
66665: 添加 org.apache.catalina.core.PropertiesRoleMappingListener
,一个从属性文件填充上下文角色映射的监听器。(michaelo)
修复了在 allowLinking
设置为 false
时,如果 Web 应用程序是故意构造以允许,则 Web 应用程序内部的符号链接仍会被跟踪的边缘情况。(markt)
在 Context
上添加了实用程序配置文件资源查找,以允许从 webapp 查找资源(前缀为 webapp:
),并使资源查找 API 更加可见。(remm)
Coyote
66627: 恢复 MessageBytes.getType()
的文档行为,即它返回原始内容的类型,而不是反映最近的转换。(markt)
66635: 更正启动时的证书日志,使其区分基于密钥库的密钥/证书和基于 PEM 文件的密钥/证书,并记录各自的相关信息。(markt)
Jasper
通过 jakarta.el.OptionalELResolver
为 Tomcat 的 Jakarta EL API 实现添加 java.util.Optional
支持,以与 Jakarta EL 6.0 API 的最新提案对齐。(markt)
添加了支持指定 Java 22 (值为 22
) 作为 JSP 编译的编译器源和/或编译器目标。如果与不支持这些值的 Eclipse JDT 编译器版本一起使用,则会记录警告并使用默认值。(markt)
WebSocket
改进 WebSocket 服务器的错误条件处理,尤其是在 Tomcat 关闭期间。(markt)
纠正了 66574 修复中的回归问题,该问题意味着 WebSocket 会话可以在 onClose()
事件完成之前为 onOpen()
返回 false。(markt)
更新 Tomcat 提供的 WebSocket API,使其与 Jakarta WebSocket 项目的最新提案对齐,并通过 SendResult
提供 WebSocket Session
实例。(markt)
Web 应用
文档。扩展安全指南以涵盖嵌入式用例,并添加关于 java.io.tmpdir
系统属性用法的注释。(markt)
66662: 文档。修复 Digest 认证阀门配置部分中 algorithms 属性名称中的拼写错误。拉取请求 #629 由 gohilmca 提供。(markt)
其他
改进了法语翻译。 (remm)
在上传到 Maven Central 的文件中包含 Windows 特定二进制分发版。(markt)
移除对在 32 位 Windows 操作系统上运行 Tomcat 的支持,因为 Java 21 不适用于该平台。(markt)
tak7iji 改进了日语翻译。(markt)
更新 Eclipse JDT 编译器到 4.28。(markt)
更新 UnboundID 到 6.0.9。(markt)
更新 Checkstyle 到 10.12.1。(markt)
更新 BND 到 6.4.1。(markt)
更新 JSign 到 5.0。(markt)
2023-06-08 Tomcat 11.0.0-M7 (markt)
通用
将最低支持的 Java 版本提高到 Java 21。(markt)
Catalina
将实用程序执行器的管理从组件的 init()
/destroy()
方法移动到 start()
/stop()
方法。(markt)
添加 RateLimitFilter,可用于缓解 DoS 和暴力破解攻击。(isapir)
移除对在 Tomcat 的自定义 WAR URL 处理程序中使用 ^
字符分隔 WAR 文件和 WAR 内容的支持。当前默认分隔符 *
保持不变。(markt)
添加 org.apache.catalina.core.StandardVirtualThreadExecutor
,一个基于虚拟线程的执行器,可与一个或多个连接器一起使用,以使用虚拟线程处理这些连接器接收到的请求。(markt)
66513: 为 PersistentValve
添加了一个会话级信号量(Semaphore),确保在单个 Tomcat 实例中,每个会话最多只有一个并发请求。同时扩展了调试日志,以包含请求是否绕过此阀门(Valve)以及请求未能获取会话级信号量的原因。(markt)
66609: 确保默认 Servlet 在使用 XML 输出时,能正确转义目录列表中文件名。基于 Alex Kachanov 的拉取请求 #621。(markt)
66618: 在默认 Servlet 生成的 XML 目录列表中添加一个数字格式的最后修改字段,以便在 XSLT 中进行排序。Alex Kachanov 的拉取请求 #622。(markt)
66621: 如果子集合具有已过期的锁,则使用 WebDAV 锁定集合的尝试可能会错误地失败。(markt)
66622: 从 HttpHeaderSecurityFilter
中移除 xssProtectionEnabled
设置,因为所有主流浏览器已移除对相关 HTTP 头部的支持。(markt)
Coyote
66602: 在调用 SwallowedDataFramePayload 时,当 dataLength 为零时未发送 WINDOW_UPDATE。由 ledefe 提供的拉取请求 #619。(lihan)
其他
更新到 Commons Daemon 1.3.4。(markt)
改进了法语翻译。 (remm)
更新 Checkstyle 到 10.12.0。(markt)
更新打包的 Apache Tomcat Native Library 到 2.0.4,以包含使用 OpenSSL 3.0.9 构建的 Windows 二进制文件。(markt)
2023-05-09 Tomcat 11.0.0-M6 (markt)
Catalina
66567: Tomcat 代码转换为使用 URI 而非 URL 后,修复缺失的 IllegalArgumentException
。(remm)
如果 AccessLogValve
中使用的 SimpleDateFormat
包含需要转义的字面字符,则转义时间戳输出。(rjung)
将 AccessLogValve
中垂直制表符的输出从 \v
更改为 \u000b
。(rjung)
将 AccessLogValve
中转义的性能提高约一倍。(rjung)
改进 JsonAccessLogValve
:支持更多模式,例如用于头部和属性的模式。这些将作为子对象记录。(rjung)
#613: 修复在使用文件锁定保护或管理器 Servlet 时可能出现的部分文件损坏副本。由 Jack Shirazi 提交。(remm)
Coyote
在字符集缓存机制中添加对新字符集 gb18030-2022
的支持(Java 21 中引入)。(markt)
修复 HTTP 头解析中的一个边缘情况,并确保没有名称的 HTTP 头被视为无效。(markt)
移除对 HTTP 连接器设置 rejectIllegalHeader
和 allowHostHeaderMismatch
的支持。这些现在已硬编码为之前的默认值。(markt)
66591: 修复了针对 66512 的修复中引入的一个回归,该回归导致对于未设置 HTTP 头的响应未发送 AJP Send Headers。(markt)
Jasper
66582: 在将 JSP 静态导入添加到 EL 上下文时,考虑到 EL 对静态导入的要求比 JSP 更严格。(markt)
WebSocket
66574: 重构 WebSocket 会话关闭逻辑,移除对 SocketWrapper
的锁,该锁是如果应用程序代码使用模拟阻塞时可能导致死锁的潜在原因。(markt)
66575: 避免在压缩转换中对用户提供的缓冲区的后备数组进行未经检查的使用。(remm)
改进 WebSocket 会话关闭期间刷新批量消息时的异常处理。(markt)
66581: 更新 AsyncChannelGroupUtil
以使其与 AsynchronousChannelGroup 的当前默认值对齐。由 Matthew Painter 提供的拉取请求 #612。(markt)
其他
改进了法语翻译。 (remm)
改进了中文翻译。(lihan)
更新 Checkstyle 到 10.10.0。(markt)
更新 Jacoco 到 0.8.10。(markt)
更新打包的 Tomcat Migration Tool for Jakarta EE 版本到 1.0.7。(markt)
2023-04-19 Tomcat 11.0.0-M5 (markt)
Catalina
为 HttpServlet
添加 doPatch
方法,以提供对 RFC 5789 中定义的 HTTP PATCH
方法的支持。这是 Servlet 6.1 API 中的一项更改。(markt)
65995: 实现 RFC 9239,并将 JavaScript 的媒体类型从 application/javascript
更改为 text/javascript
。(markt)
Tomcat 启动时不再设置 java.protocol.handler.pkgs
系统属性。用户现在可以根据需要自由配置此属性。(markt)
添加一个使用 JSON 格式的访问日志阀门。基于 Thomas Meyer 提供的拉取请求 #539。(remm)
通过在 FORM 认证过程创建会话时使用缩短的会话超时,增强 FORM 认证过程以抵御 DoS 攻击。此超时的持续时间由 FORM 认证器的 authenticationSessionTimeout
属性配置。(markt)
实现新的 Servlet API 方法,在向客户端发送重定向时提供额外的控制。(markt)
更新摘要认证支持以符合 RFC 7616。这为 DigestAuthenticator
添加了一个新的配置属性 algorithms
,默认值为 SHA-256,MD5
。(markt)
将 maxParameterCount
的默认值从 10,000 减少到 1,000。(markt)
66527: 更正 Tomcat.addWebapp()
方法的 Javadoc,该 Javadoc 错误地声明 docBase
参数可以是相对路径。(markt)
66524: 更正 WebResource 缓存中的逐出顺序,使其按预期为 LRU(最近最少使用)。(schultz)
在 RealmBase
中添加对自定义用户属性的支持代码。基于 Carsten Klein 在 #473 中提供的代码。(remm)
扩展在生成 TRACE
请求响应时应跳过的敏感 HTTP 请求头集合。这与 Servlet 6.1 规范的当前草案一致。(markt)
66541: 改进使用自定义 URL 方案的缓存资源的处理。现在,如果存在,将对这些资源的 URL 使用特定于方案的 equals()
和 hashCode()
算法。这解决了某些 OSGi 自定义 URL 方案的潜在性能问题,这些方案在某些配置中可能触发潜在缓慢的 DNS 查找。基于 Tom Whitmore 提供的补丁。(markt)
当使用作为 Web 应用程序一部分部署的自定义会话管理器时,在验证从请求中提取的会话 ID 时避免 ClassNotFoundException
。(markt)
66543: 为 StandardContext#fireRequestDestroyEvent
添加自己的日志消息。(fschumacher)
66554: 在服务器初始化期间初始化 Random,以避免在某些平台上的 Web 应用程序上下文中可能创建 JVM 线程。(remm)
通过名为 org.apache.tomcat.util.threads.ScheduledThreadPoolExecutor
的 Servlet 上下文属性,使服务器实用程序执行器可用于 Web 应用程序。(remm)
Coyote
JSON 过滤器应支持对 RFC 8259 中定义的常见特殊字符进行特定转义。基于 Thomas Meyer 提交的代码。(remm)
66511: 修复 GzipOutputFilter
(用于压缩 HTTP 响应)与直接缓冲区一起使用时的问题。Arjen Poutsma 建议的补丁。(markt)
66512: 将 AJP 对无效 HTTP 响应头的处理(现在从响应中移除)与 HTTP 对齐。(markt)
66530: 修正了针对 Bug 66442 的修复中引入的一个回归,该回归导致没有响应主体的流在完成时没有减少活动流计数,从而导致某些连接出现 ERR_HTTP2_SERVER_REFUSED_STREAM
。(markt)
移除对 javax.security.cert
包中已弃用类的使用。由 Eirik Bjorsnos 提供的拉取请求 #608。(markt)
Jasper
修复了一个 bug,该 bug 导致 LambdaExpression
强制转换为函数式接口调用的某些实例失败。(markt)
66536: 修复标签文件解析问题,该问题导致某些标签文件的标签指令可能被忽略。(markt)
使 EL 实现与 Jakarta EL 规范的最新更改对齐,并为 ArrayELResolver
添加对 length 属性的支持。(markt)
集群
66535: 重新定义 FarmWarDeployer
的 maxValidTime
属性,使其成为在传输文件部分之前允许的最大时间,超过该时间传输将被取消,并且相关资源将被清理。如果文件传输被取消,将记录一条新的警告消息。(markt)
WebSocket
66508: 当 WebSocket 与 NIO2 一起使用时,如果在写入过程中发生 I/O 错误,则避免在发送关闭帧之前等待超时。(markt)
66548: 扩展对启动 WebSocket 连接的 HTTP 升级请求中 Sec-Websocket-Key
头的值的验证。该值未被解码,但会检查其长度是否正确以及是否仅使用了 base64 字母表中有效字符。(markt)
Web 应用
66542: 文档。更新 JNDI 文档,将对 JavaMail 的引用替换为对 Jakarta Mail 的引用。(markt)
其他
改进了法语翻译。 (remm)
改进日语翻译。由 Shirayuking 和 tak7iji 贡献。(markt)
改进中文翻译。由 totoo 贡献。(markt)
重构使用 MD5Encoder
的代码,以使用 HexUtils.toHexString()
。(markt)
66507: 修复了在 catalina.sh
中调用 version
时 $JAVA_OPTS
未传递给 JVM 的 bug。由 Eric Hamilton 建议的补丁。(lihan)
更新 Commons DBCP 的内部分支到 f131286 (2023-03-08, 2.10.0-SNAPSHOT)。这修复了 11.0.0-M2 中引入的一个回归。(markt)
改进 JRE_HOME
或 JAVA_HOME
未正确设置时的错误消息。在 Windows 上,统一启动脚本和服务安装脚本对 JRE_HOME
和 JAVA_HOME
的处理。(markt)
更新到 Eclipse JDT 编译器 4.27。(markt)
更新 UnboundID 到 6.0.8。(markt)
更新 Checkstyle 到 10.9.3。(markt)
更新 Jacoco 到 0.8.9。(markt)
增强 PEMFile 以支持从 InputStream 加载。由 Romain Manni-Bucau 提供的补丁。(schultz)
2023-03-06 Tomcat 11.0.0-M4 (markt)
通用
修复了 SynchronizedStack
中内存分配大于限制的 bug,以减少内存占用。(lihan)
Catalina
添加对 mod_rewrite 的 txt:
和 rnd:
重写映射类型的支持。基于 Dimitrios Soumis 提供的拉取请求 #591。(remm)
当拒绝使用 CONNECT 方法的 HTTP 请求时,提供更合适的响应(501 而非 400)。(markt)
66491: 恢复使用 ServiceLoader 机制加载 Tomcat 使用的自定义 URL 协议处理器的更改。已恢复基于原始系统属性的方法。(markt)
Coyote
添加对 HTTP/2 中方案伪标头有效性的检查。(markt)
66482: 在 NIO2 中的异步操作后恢复内联状态,以考虑到实现有时会抛出意外异常的事实。由 zhougang 提交的补丁。(remm)
Jasper
提供 JavaBeans 支持子集的实现,该实现不依赖于 java.beans
包。这供 Expression Language 在 java.desktop
模块(java.beans
包所在之处)不可用时使用。(markt)
2023-02-23 Tomcat 11.0.0-M3 (markt)
通用
将支持的最低 Java 版本提高到 Java 17。请注意,Jakarta EE 11 允许最低 Java 版本为 21。Tomcat 11 的最低 Java 版本在第一个稳定版本发布之前可能会提高到 Java 21。(markt)
Catalina
允许阀门(Valve)从无法映射到上下文(Context)的请求中访问 Cookie。(markt)
实现用于设置字符编码的新的 Servlet API 方法,该方法接受 Charset
对象。(markt)
默认的 HEAD 响应不再包含某些 HTTP 头字段,其值仅在生成内容时根据 RFC 9110 的第 9.3.2 节确定。(markt)
66438: 更正 JPMS 元数据中 Jakarta 模块的名称。(markt)
切换到使用 ServiceLoader 机制加载 Tomcat 使用的自定义 URL 协议处理器。(markt)
切换到使用 LongAdder
而非 AtomicInteger
来跟踪 Servlet 的请求计数和错误计数。(markt)
实现 Jakarta Servlet 项目的澄清,即映射到上下文根的 Servlet 应该针对带或不带尾部 /
的上下文根请求进行映射。(markt)
实现 Jakarta Servlet 项目的澄清,即在非阻塞模式下对流调用 ServletOutputStream.close()
会立即返回,流实际上已关闭,并且任何剩余待写入的数据都会由容器在后台写入。(markt)
避免在从不良 JAR URL 扫描时可能出现的 ISE(IllegalStateException),以在删除捕获 ISE 的 Java 9+ 反射代码后恢复之前的行为。(remm)
重构 String.replaceAll()
的使用,在不使用正则表达式的情况下改用 String.replace()
。由 Andrei Briukhov 提供的拉取请求 #581。(markt)
添加错误报告阀门,允许从外部 Web 服务器重定向或代理。基于 Max Fortun 提供的拉取请求 #506 中的代码和想法。(remm)
66470: 将 RFC 6598 中定义的共享地址空间(100.64.0.0/10)添加到用于识别 RemoteIpFilter
和 RemoteIpValve
内部代理的正则表达式中。(markt)
66471: 修复当 RemoteIpFilter
确定此请求是通过安全通道提交时 JSessionId secure 属性丢失的问题。(lihan)
为 HttpServletResponse
添加 Jakarta Servlet 项目为 Servlet 6.1 API 定义的额外 HTTP 状态码常量。(markt)
实现 Jakarta Servlet 项目的澄清,即在 HttpServletResponse
的某个方法中设置 HTTP 头部值时,如果将 null
作为新的头部值,则会移除该名称的任何现有头部。(markt)
Coyote
Tomcat 启动时,记录每个配置的 TLS 证书的基本信息。(markt)
66442: 当 HTTP/2 响应不应包含主体时,确保在头部帧上设置流结束标志,并且不发送数据帧。(markt)
修复了一个 bug,该 bug 导致在使用配置了 useAsyncIO=true
(默认值)的连接器时,HTTP/2 连接无法超时。(markt)
为配置的 TLS 证书日志提供了专用记录器(org.apache.tomcat.util.net.NioEndpoint.certificate
/ org.apache.tomcat.util.net.Nio2Endpoint.certificate
)。(markt)
Jasper
66419: 修复表达式语言对接受可变参数的方法的调用,当只传递一个参数时的问题。(markt)
66441: 使 JSP 中静态字段的导入对页面上使用的任何 EL 表达式可见。(markt)
Web 应用
66429: 文档。默认情况下,将文档 Web 应用程序的访问限制为 localhost。(markt)
66429: 示例。默认情况下,将示例 Web 应用程序的访问限制为 localhost。(markt)
其他
更新 BND 到 6.4.0。(markt)
移除在 SecurityManager 下启动 Tomcat 的支持。(markt)
改进了中文翻译。(lihan)
改进了法语翻译。 (remm)
tak7iji 改进了日语翻译。(markt)
改进韩语翻译。(woonsan)
更新打包的 Apache Tomcat Native Library 到 2.0.3,以包含使用 OpenSSL 3.0.8 构建的 Windows 二进制文件。(markt)
未发布 Tomcat 11.0.0-M2 (markt)
Catalina
更新 Servlet API 中的 ServletInputStream
和 ServletOuputStream
类,使其与 Jakarta Servlet 规范的最新更新对齐,以支持使用 ByteBuffer
进行读写。这些更改还澄清了 Servlet 非阻塞 API 的各个方面。(markt)
66388: 修正了重构中替换 URL
构造函数使用方式时引入的一个回归。该回归导致在 URI 路径中使用名称中包含一个或多个需要转义字符的资源时查找失败。(markt)
66392: 将 AccessLogValve
的文件编码默认值更改为 UTF-8 并更新文档。(lihan)
66393: 使 ExtendedAccessLogValve
的 x-P(XXX) 与文档对齐。(lihan)
移除 JAX-RPC 支持,该支持已从 Jakarta EE 9 的 Jakarta EE 平台中移除。(markt)
Coyote
更新 Cookie 解析和处理,将带引号的 Cookie 值中的引号视为值的一部分,这符合 RFC 6265 的要求,并在 RFC 6265bis 中明确澄清。(markt)
添加 RFC 8941 结构化字段解析器。(markt)
添加 RFC 9218 中定义的 priority
HTTP 头部字段的解析器。(markt)
当由于在请求完全读取之前已生成最终响应而重置 HTTP/2 流时,使用 HTTP/2 错误代码 NO_ERROR
,以便客户端不会丢弃响应。基于 Lorenzo Dalla Vecchia 的建议。(markt)
66385: 纠正 HTTP/2 中的一个 bug,其中使用 NIO2 连接器对新帧进行非阻塞读取时错误地使用了读取超时,导致意外的流关闭。(markt)
Jasper
66370: 将 org.apache.el.GET_CLASSLOADER_USE_PRIVILEGED
系统属性的默认值更改为 true
,除非 EL 库在 Tomcat 上运行,在这种情况下默认值仍为 false
,因为 EL 库已在特权块内调用,并且跳过不必要的特权块可提高性能。(markt)
添加对指定 Java 21(值为 21
)作为 JSP 编译的编译器源和/或编译器目标的支持。如果与不支持这些值的 Eclipse JDT 编译器版本一起使用,将记录警告并使用默认值。(markt)
其他
更新打包的 Apache Tomcat Migration Tool for Jakarta EE 到 1.0.6。(markt)
更新 Apache Commons BCEL 的内部分支到 2ee2bff (2023-01-03, 6.7.1-SNAPSHOT)。(markt)
更新 Apache Commons Codec 的内部分支到 3eafd6c (2023-01-03, 1.16-SNAPSHOT)。(markt)
更新 Apache Commons FileUpload 的内部分支到 34eb241 (2023-01-03, 2.0-SNAPSHOT)。(markt)
更新 Apache Commons DBCP 的内部分支到 f131286 (2023-01-03, 2.10.0-SNAPSHOT)。(markt)
改进日语翻译。由 Shirayuking 贡献。(markt)
改进葡萄牙语翻译。由 Guilherme Custódio 贡献。(markt)
更新到 Eclipse JDT 编译器 4.26。(markt)
更新 Checkstyle 到 10.6.0。(markt)
更新 Unboundid 到 6.0.7。(markt)
更新 SpotBugs 到 4.7.3。(markt)
2022-12-05 Tomcat 11.0.0-M1 (markt)
通用
此版本包含 Apache Tomcat 10.1.1 中的所有更改以及下面列出的额外更改。(markt)
Catalina
66175: 将 BasicAuthenticator
使用的默认字符集从 ISO-8859-1 更改为 UTF-8。(markt)
66209: 添加一个配置选项,允许用于索引 JAR 文件的布隆过滤器在 Web 应用程序的整个生命周期中保留。在此添加之前,索引总是通过对 WebResourceRoot.gc()
的定期调用来刷新。作为此添加的一部分,归档索引的配置从 Context
移动到 WebResourceRoot
。基于 Rahul Jaisimha 提供的补丁。(markt)
66330: 修正了修复 62897 时引入的一个回归,该回归导致在 Context
上为 skipMemoryLeakChecksOnJvmShutdown
配置的任何值都被忽略,并且始终使用默认值。(markt)
66331: 修复了 SystemLogHandler
中 Stack
重构的一个回归,该回归捕获了错误的异常。(lihan)
66338: 修复了 ErrorReportValve
重构中导致细微差异的一个回归。(lihan)
转义用于为 JsonErrorReportValve
构建输出的值,以确保它始终输出有效的 JSON。(markt)
更正 HttpServletRequest.isTrailerFieldsReady()
的默认实现以返回 true
,使其与 HttpServletRequest.getTrailerFields()
的默认实现以及 Jakarta EE 项目提供的 Servlet API 保持一致。(markt)
重构 WebappLoader
,使其在配置为在类加载时使用转换器的情况下,才对 Jakarta EE 迁移工具具有运行时依赖。(markt)
改进在 Servlet 上下文中设置的凭据处理程序属性的行为,使其能实际反映认证期间使用的内容。(remm)
66359: 更新 RemoteIpValve 和 RemoteIpFilter 的 javadoc,将正确的 protocolHeader
默认值设置为 "X-Forwarded-Proto"。(lihan)
添加对错误分派新属性 jakarta.servlet.error.query_string
的支持。(markt)
更新 Context
上的 ignoreAnnotation
属性,使其与 metadata-complete
分离。(remm)
Coyote
更正 HTTP Cookie 的 expires 属性使用的日期格式。应使用单个空格而不是单个破折号来分隔日、月和年部分,以符合 RFC 6265。(markt)
当由于尝试在不允许写入的状态下写入流而导致流被取消时,在错误消息中包含当前流状态的名称。(markt)
NIO 写入从不返回 -1,因此重构 CLOSED_NIO_CHANNEL
以避免返回 -1 并移除对此返回值的检查。基于 tianshuang 提供的拉取请求 #562。(markt)
移除不必要的代码,这些代码将 asyncTimeout
暴露给从未使用它的组件。(markt)
确保所有 MessageBytes
到字节数组的转换对于配置的字符集都是有效的,否则抛出异常。(markt)
当 HTTP/2 流被重置时,当前活动流计数未减少。如果连接上发生足够的重置,则会达到当前活动流计数限制,并且无法在该连接上创建新流。(markt)
Jasper
66294: 使获取线程上下文类加载器的特权块(为解决 62080 而添加)变为可选,并默认禁用。这现在由 org.apache.el.GET_CLASSLOADER_USE_PRIVILEGED
系统属性控制。(markt)
66317: 修复 Lambda 强制转换安全管理器缺少权限的问题。基于 Isaac Rivera Rivas 提供的拉取请求 #557。(lihan)
66325: 修复包含 Lambda 表达式的表达式语言评估中的并发问题。(markt)
更新 JSP API 中的 ErrorData
类,使其与 Jakarta Pages 规范的最新更改对齐,以支持新的错误分派属性 jakarta.servlet.error.query_string
。
Web 应用
66348: 更新类加载器文档中列出的 JARs,并注明哪些是可选的。(markt)
文档。将应用程序开发人员指南中对 CVS 的引用替换为对版本控制系统更通用的引用。(markt)
jdbc-pool
66346: 确保所有 JDBC 连接池 JARs 都是可复现的。由 John Neffenger 提供的拉取请求 #566。(markt)
其他
更新到 Commons Daemon 1.3.3。(markt)
66323: 将模块启动参数从 JDK_JAVA_OPTIONS
移动到 JAVA_OPTS
,因为现在最低 Java 版本为 11,并且这些选项始终是必需的。(markt)
改进中文翻译。由 DigitalCat 和 lihan 贡献。(markt)
改进法语翻译。由 Mathieu Bouchard 贡献。(markt)
改进日语翻译。由 Shirayuking 和 tak7iji 贡献。(markt)
改进了韩语翻译。 (markt)
改进西班牙语翻译。(markt)
修正了移除 APR 连接器时导致 Graal 原生映像支持中断的回归。由 Sébastien Deleuze 提供的拉取请求 #564。(markt)
更新打包的 Apache Tomcat Native Library 到 2.0.2,以包含使用 OpenSSL 3.0.7 构建的 Windows 二进制文件。(markt)
更新打包的 Apache Tomcat Migration Tool for Jakarta EE 到 1.0.5。(markt)
重构代码库以替换 URL 构造函数的使用。虽然它们在 Java 20 及更高版本中已弃用,但弃用的原因适用于所有版本,因此现在开始弃用它们。(markt)
优化 Tomcat 原生映像元数据,以避免包含非 Tomcat 资源。由 Sébastien Deleuze 提供的拉取请求 #569。(markt)
更新 Apache Commons BCEL 的内部分支到 b015e90 (2022-11-28, 6.7.0-RC1)。(markt)
更新 Apache Commons Codec 的内部分支到 ae32a3f (2022-11-29, 1.16-SNAPSHOT)。(markt)
更新 Apache Commons FileUpload 的内部分支到 aa8eff6 (2022-11-29, 2.0-SNAPSHOT)。(markt)