You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:12:42