← 返回文章列表

Spring Framework 7.0.9 发布:SpEL 编译默认关闭,转发头必须明确表态

Java安全JVM

7.0.x 的收尾版本

Spring Framework 7.0.9 于 2026 年 8 月 20 日发布。作为 7.0.x 系列的维护版本,它没有堆砌新功能,重心放在三件事上:安全边界收敛、内存泄漏修复、高并发场景下的稳定性提升。官方也明确了 7.0.x 到此为止,后续新特性会走 7.1.x 线。

换句话说,这是一个以「稳」为主的版本,但里面有两项改动会直接碰到业务代码,升级前需要先看过。

SpEL 编译默认关闭

这是本次最需要关注的一项。以前可以通过 spring.expression.compiler.mode 让 SimpleEvaluationContext 走编译执行来提速,7.0.9 起默认关闭了。

原因在于近期接连爆出多个与 SpEL 表达式编译相关的漏洞(CVE-2026-41849、CVE-2026-41850、CVE-2026-41851、CVE-2026-41852 等)。不少企业应用其实并没有用到表达式编译,却因为默认开启而暴露了攻击面,于是官方选择把默认行为反转过来。

带来的影响是:如果应用确实依赖编译执行带来的性能提升,并且能确认所有表达式的来源和内容都可信,需要显式调用 .withCompilationSupported() 手动开启。升级后建议先检查有没有相关配置,再决定要不要显式启用,不要想当然地沿用旧行为。

转发头处理必须明确表态

ForwardedHeaderFilter(MVC)和 ForwardedHeaderTransformer(WebFlux)现在要求明确选择:使用标准的 Forwarded 头,还是沿用 X-Forwarded-* 系列。对应的做法是改用带布尔参数的新构造函数。

两者的区别在于,Forwarded 是 IETF 在 RFC 7239 中正式定义的标准化头部,用一个头统一携带转发信息;而 X-Forwarded-For、X-Forwarded-Host、X-Forwarded-Proto 属于事实标准,格式和实现差异较大,容易出现不一致。官方已说明,旧的无参构造函数将在 7.1 被废弃。

对部署在 Nginx 或各类网关后面的应用,这项改动值得优先检查。转发头解析出错,直接影响的是客户端真实 IP 和协议判断,进而影响访问日志、限流策略和重定向地址,问题往往要到线上才被发现。

内存与稳定性方面的修复

几处改动都指向长期运行的稳定性。注解元数据不再持有 class 文件引用,Metaspace 的压力随之下降。SpEL 中 BigDecimal 与 BigInteger 的幂运算加上了上限,堵住了通过恶意构造表达式耗尽 CPU 的路径。URI 解析现在会忽略空的端口值,不再因为一个格式细节就抛错。

缺陷修复里有两个场景比较典型:一是 EclipseLink 在高负载下因为单例锁,导致所有 JDBC 连接排队获取的问题;二是 RSocket SETUP 帧处理中的 Buffer 泄漏。此外还提前修掉了与 Hibernate 8.0 / JPA 4.0 配合时创建原生查询报错的问题,算是给后续升级留了余地。

升级建议

7.0.9 包含重要的安全修复,处在 7.0.x 线上的应用建议跟进。升级前重点排查两类代码:一是任何与 SpEL 编译相关的配置和使用方式,二是转发头的解析配置。Spring Security、Spring GraphQL 等兄弟项目也已经做了适配,整体升级路径比较顺。

如果已经在评估 7.1,可以留意 v7.1.0-M1 和 v7.1.0-M2 的进展,正式版预计会很快到来。对于仍在使用 SpEL 编译且无法立刻验证表达式安全性的团队,更稳妥的做法是先跟着 7.0.9 把安全补丁吃下,把编译执行的性能优化放到下一个迭代再单独评估。