Spring WebFlux(Netty)服务端如何处理管道符等特殊字符?
解决方案:Spring WebFlux + Netty 允许未编码的特殊查询字符
1. 自定义Netty服务器配置
由于Netty默认会严格校验URL中的字符,未编码的管道符(|)这类特殊字符会被判定为非法请求,直接返回400。我们可以通过自定义Netty的HttpServer配置,放松对查询字符的校验限制。
实现WebServerFactoryCustomizer<NettyReactiveWebServerFactory>接口来修改配置:
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; import reactor.netty.http.server.HttpServer; @Component public class NettyServerCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> { @Override public void customize(NettyReactiveWebServerFactory factory) { factory.addServerCustomizers(httpServer -> httpServer.httpDecoder(decoder -> decoder.allowUnsafeUrl(true) // 允许解析包含未编码特殊字符的URL ) ); } }
2. 验证控制器功能
配置完成后,原控制器可以正常获取包含特殊字符的原始查询参数:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.http.server.reactive.ServerHttpRequest; import reactor.core.publisher.Mono; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RestController public class TestController { @GetMapping(path = "/test", produces = APPLICATION_JSON_VALUE) public Mono<String> getData(ServerHttpRequest serverHttpRequest) { String rawQuery = serverHttpRequest.getURI().getRawQuery(); // 此时rawQuery会完整获取到"identifier=test|code",可直接传递至其他服务器 return Mono.just(rawQuery); } }
注意事项
allowUnsafeUrl(true)会允许Netty解析所有RFC定义的"unsafe"字符,除了管道符外,还包括{、}、(空格)等。- 该配置会降低URL的安全性,可能引入注入类风险,若服务暴露在公网环境,需在业务层对获取到的查询参数做额外校验,平衡业务需求与安全风险。
内容的提问来源于stack exchange,提问作者Jonathan Hagen
相关产品推荐
相关产品推荐

