如何读取URL中带^符号的查询参数 解决eBay回调接口400错误问题
问题根因
你遇到的400错误不是业务代码的问题,是Spring Boot内嵌的Web容器(默认Tomcat)默认限制了URL查询参数中允许出现的特殊字符,^不在默认允许的字符列表中,请求还没进入Controller层就被容器直接拦截返回了400。
解决方案
方案1:修改容器配置放开特殊字符限制(最推荐,无需修改业务逻辑)
如果使用默认Tomcat容器,直接在application配置文件中添加如下配置即可:
- application.properties格式:
server.tomcat.relaxed-query-chars=^
- application.yml格式:
server: tomcat: relaxed-query-chars: ^
如果有其他需要放行的特殊字符,用英文逗号分隔添加到配置值里即可。
如果使用Undertow作为内嵌容器,添加配置:
server.undertow.allow-unescaped-characters-in-url=true
方案2:手动解析原始请求参数(备选)
如果因为特殊原因不能修改容器配置,在确认容器放行了请求之后,可以修改Controller方法直接读取原始请求的查询字符串自行解析:
@RestController @RequestMapping(path = ["/api/ebay/auth"]) class EbayAuthController { @GetMapping(path = [""]) fun getAccessToken(request: HttpServletRequest) { val queryString = request.queryString // 自行从queryString中解析code参数的值 val code = queryString.split("&") .firstOrNull { it.startsWith("code=") } ?.substringAfter("code=") println("Auth code: $code") } }
注意事项
放开特殊字符限制后,建议在拿到code参数后增加合法性校验,避免恶意请求带来的安全风险,你这个接口仅用于eBay回调,校验逻辑成本很低。
内容的提问来源于stack exchange,提问作者nykon
相关产品推荐
相关产品推荐

