Springboot2 升级Springboot3.3.5 网关篇
升级后 GlobalFilter 修改 header 报 UnsupportedOperationException
原代码如下: 使用 exchange.mutate()
ServerHttpRequest.Builder builder = exchange.getRequest().mutate().header(DumboConstants.TRACE_KEY, traceContext.getTraceId()).header(DumboConstants.SPAN_KEY, String.valueOf(traceContext.getSpanId()));
背景:
- 在Springboot 2 系列中,通过mutate() 之后是可以产生一个新的可变的 ServerHttpRequest 对象,可以对请求头等一些相关属性进行调整修改。也是spring 官方推荐的方式
- 在升级Springboot3x 之后,通过exchange.mutate()之后修改header 属性一直抛 UnsupportedOperationException。 不能去修改属性。
debug 排查后问题初步分析
在 Spring Boot 2.x 中,exchange.getRequest().mutate().header(…) 是允许的,但在 Spring Boot 3(Spring 6) 之后,这种方式会导致 UnsupportedOperationException。
在 Spring Boot 3 中,exchange.getRequest() 返回 StrictFirewallServerWebExchange,而在 Spring Boot 2 中,它返回的是 Netty 相关的 ServerHttpRequest, Spring Boot 3 引入了更严格的安全防护机制(StrictFirewallServerWebExchange),导致 mutate() 方法无法像以前一样修改请求头。
问题分析
- Spring Boot 3 采用了
StrictFirewallServerWebExchange
:StrictFirewallServerWebExchange
是 Spring WebFlux 6