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

SpringBoot2.x下URL含问号致请求400错误及浏览器编码疑问

问题解析与解决方案

一、路径含?导致400错误的原因

SpringBoot 2.x默认搭载的Tomcat 9+版本严格遵循RFC 3986规范:URL的路径部分(?之前的内容)不允许出现?这类保留字符。你把包含?的JSON直接嵌入URL路径,?属于路径非法字符,Tomcat会直接拦截请求,返回Invalid character found in the request target错误。

移除redirect_uri里的问号后,路径字符符合规范,请求自然恢复正常,但这只是临时 workaround。本质问题是不该把JSON放在URL路径中传递——路径设计的初衷是定位资源,而非承载复杂参数。

二、浏览器对路径/参数的编码差异

  • 路径部分:浏览器会自动编码路径中的非法字符(比如{转%7B),因为路径必须严格符合RFC规范,浏览器为保证请求能正常发送,会自动处理这类字符。
  • 参数部分:浏览器不会自动编码参数里的非法字符,虽然参数规则相对灵活,但服务器端(如Tomcat)仍会检查字符合规性。当参数里出现{这类字符时,Tomcat默认配置会判定为非法请求,返回400。若要传递这类字符,需手动编码(如{转%7B)。

三、可行解决方案

1. 调整请求方式(推荐)

放弃在路径中传递JSON,改用POST请求,把JSON放在请求Body中传递。这种方式既符合HTTP规范,又彻底规避非法字符问题。

2. 对路径内容做URL编码(迫不得已时用)

前端先对整个JSON字符串做URL编码,例如将原JSON编码为:

%7B%22client_id%22%3A%2248e09e3-87b8395f7c5f%22%2C%22redirect_uri%22%3A%22https%3A%2F%2Ftestvei.cn%2Fvestomer%2FGjViQ%3FcardBag%3D1%22%2C%22state%22%3A%22GWeiQ%22%2C%22scope%22%3A%22phonginfo%2Copenid%22%2C%22response_type%22%3A%22code%22%7D

后端再通过URLDecoder.decode()解析。

3. 修改Tomcat配置(不推荐生产环境)

若不想改动代码,可在SpringBoot配置中放宽Tomcat的字符检查:

server.tomcat.relaxed-path-chars=[]|{}^\`"<>
server.tomcat.relaxed-query-chars=[]|{}^\`"<>

但此方式会降低请求安全性,仅建议在测试环境临时使用。

内容的提问来源于stack exchange,提问作者J John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:12:51