You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Tomcat 8.5如何允许URL含^字符?配置后仍报400错误

Tomcat中含^字符的请求仍返回400错误的解决方案

首先咱们先明确你的场景:你有一个包含^字符的请求URL,具体如下:

http://hostname:port/path&param1={"vars":[{"a":"val1","b":"^"},{"c":"val2","d":"^"}]}&param2=Value3|95|3%20-%206%20Months

你已经知道弃用的tomcat.util.http.parser.HttpParser.requestTargetAllow属性需要替换为Connector标签里的relaxedPathCharsrelaxedQueryChars,但配置后还是收到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版本兼容性

relaxedQueryCharsrelaxedPathChars是在这些版本之后才引入的:

  • Tomcat 7.0.73+
  • Tomcat 8.0.39+
  • Tomcat 8.5.7+
  • Tomcat 9.0.0.M12+
    如果你的Tomcat版本低于这些,这些属性不会生效,需要升级Tomcat或者寻找其他兼容方案。

按照上面的步骤调整后,再测试你的请求,应该就能解决400错误的问题了。

内容的提问来源于stack exchange,提问作者Sachin Kumar

火山引擎 最新活动