升级后Spring Cloud Gateway无法处理编码斜杠(%2F)请求求助
解决Spring Cloud Gateway升级后拒绝含编码斜杠(%2F)请求的问题
问题根源与破坏性变更
- Spring Cloud Gateway 2023.0.x(Leyton版本)基于Spring Boot 3.2.x,而Spring Boot 3.x开始默认严格遵循RFC 3986规范,拒绝包含编码斜杠(
%2F)的请求,这是明确的破坏性变更,目的是提升安全性,规避路径遍历类攻击风险。 - 另外,Spring Cloud Gateway底层依赖Reactor Netty作为HTTP客户端和Web服务器,而非Tomcat,所以你之前针对Tomcat的
WebServerFactoryCustomizer配置完全不生效,这是版本升级后的核心差异点。
解决方案
1. 全局配置(通过配置文件)
在application.yml或application.properties中添加Reactor Netty的配置,全局允许编码斜杠:
YAML格式:
spring: cloud: gateway: httpclient: reactor: options: tcp: child: allow-encoded-slash: true
Properties格式:
spring.cloud.gateway.httpclient.reactor.options.tcp.child.allow-encoded-slash=true
2. 自定义HttpClient配置(代码方式)
如果需要更灵活的配置逻辑,可以通过自定义HttpClientCustomizer实现:
import org.springframework.cloud.gateway.config.HttpClientCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import reactor.netty.http.client.HttpClient; import io.netty.channel.ChannelOption; @Configuration public class GatewayHttpConfig { @Bean public HttpClientCustomizer encodedSlashAllowCustomizer() { return httpClient -> httpClient.tcpConfiguration(tcpClient -> tcpClient.bootstrap(bootstrap -> bootstrap.childOption(ChannelOption.ALLOW_ENCODED_SLASH, true) ) ); } }
3. 针对特定路由开启(更安全)
如果不想全局放宽限制,可以针对特定路由单独配置允许编码斜杠:
spring: cloud: gateway: routes: - id: target-service-route uri: lb://your-target-service predicates: - Path=/target-service/** metadata: allowEncodedSlash: true
注意事项
- 允许编码斜杠会引入路径遍历攻击风险,建议仅在必要场景开启,同时确保后端服务做好对应的权限校验与路径合法性验证。
- 升级后需同步关注Spring Boot 3.x的其他兼容性变更,比如Jakarta EE替代Java EE的API调整,避免出现隐性问题。
内容的提问来源于stack exchange,提问作者kpolli
相关产品推荐
相关产品推荐

