Tomcat 8.5处理含%5B、%5D的编码URL返回400错误问题咨询
问题原因
- Tomcat 8.5及更高版本默认启用了严格的URL字符合规校验,遵循RFC 3986规范要求,
[、]属于保留字符,默认不允许出现在URL路径或查询字符串中,即使客户端已经做了URL编码转换为%5B、%5D,也会被Tomcat的校验逻辑拦截,直接返回400错误。 - 访问日志中呈现解码后的URL是Tomcat日志组件的默认处理逻辑,和请求链路中的Nginx无关,你确认Nginx未对URL做解码的判断是正确的。
解决方案
方法1:修改Tomcat全局配置(推荐)
编辑Tomcat安装目录下conf/server.xml文件,找到HTTP服务对应的<Connector>节点,新增relaxedPathChars和relaxedQueryChars属性,放行[、]字符:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" relaxedPathChars="[]" relaxedQueryChars="[]" />
如果你的业务还用到其他被拦截的特殊字符,可以把对应字符补充到上述两个属性的取值中即可,配置修改后重启Tomcat生效。
如果使用Spring Boot内嵌Tomcat,可通过自定义Tomcat连接器的配置类注入上述两个参数实现同样效果。
方法2:调整业务传参逻辑
如果不方便修改Tomcat配置,可调整业务编码规则,避免将[、]这类RFC保留字符放在URL路径中,改为放到POST请求体、或者转换为其他非保留字符(如下划线、短横线)传递。
内容的提问来源于stack exchange,提问作者tdudgeon
相关产品推荐
相关产品推荐

