Tomcat 8.5如何允许URL含^字符?配置后仍报400错误
Tomcat中含
^字符的请求仍返回400错误的解决方案 首先咱们先明确你的场景:你有一个包含^字符的请求URL,具体如下:
http://hostname:port/path¶m1={"vars":[{"a":"val1","b":"^"},{"c":"val2","d":"^"}]}¶m2=Value3|95|3%20-%206%20Months
你已经知道弃用的tomcat.util.http.parser.HttpParser.requestTargetAllow属性需要替换为Connector标签里的relaxedPathChars和relaxedQueryChars,但配置后还是收到400错误,问题大概率出在这几个地方:
1. 遗漏了其他需要放松的特殊字符
你的请求里不只有^,查询参数里还包含{|}这些字符——这些也属于Tomcat默认禁止的特殊字符,只配置^显然不够,得把所有出现在查询字符串里的特殊字符都加入relaxedQueryChars。
2. 调整后的正确Connector配置
把你的Connector标签修改成这样,包含所有需要允许的特殊字符:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedQueryChars="^{|}" relaxedPathChars="^"/>
这里划个重点:
relaxedQueryChars负责处理查询字符串(也就是URL里?之后的部分,你的请求用&开头的参数也属于这部分)里的特殊字符relaxedPathChars负责处理URL路径部分的特殊字符,你的场景里路径没有特殊字符,但保留^也不会有问题
3. 必须重启Tomcat生效
修改server.xml配置后,一定要重启Tomcat服务,配置才会加载生效,这一步很容易被忽略,别忘啦。
4. 确认Tomcat版本兼容性
relaxedQueryChars和relaxedPathChars是在这些版本之后才引入的:
- Tomcat 7.0.73+
- Tomcat 8.0.39+
- Tomcat 8.5.7+
- Tomcat 9.0.0.M12+
如果你的Tomcat版本低于这些,这些属性不会生效,需要升级Tomcat或者寻找其他兼容方案。
按照上面的步骤调整后,再测试你的请求,应该就能解决400错误的问题了。
内容的提问来源于stack exchange,提问作者Sachin Kumar




