Tomcat高版本中特殊字符问题 :java.lang.IllegalArgumentException: Invalid character found in the request target
post请求,请求中带有JSON格式的参数。在tomcat8.5.3、tomcat9中,请求会被拦截,在tomcat7.0.84中就不会。
JSON:
{
"aaa": [758, 2392],
"bbb": [755],
"ccc": [760]
}
报错:
原因:
查了资料,大部分都说是新的标准中,请求不支持“{}”,但是把大括号转义之后还是出现同样的问题,后来把中括号转义后就可以了。找到问题的原因了:
由于json中带有“[]”,请求会被tomcat拦截。这个我有点不是很理解,按照RFC7230和3986中的定义,“[]”应该是保留字,不应该被拦截的。这个有点不懂了,没细看。
根据网上找到的各种牛人的解决方案,总结了一下:
1.换到低版本的Tomcat(FNMDX!)
2.在Catalina.properties中添加
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
这个东西明显是允许“|”和大括号的,但是我现在的问题是中括号。
3.添加
tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
这个是允许url中带有特殊字符的。试过了,也不好使。
到这里似乎就卡住了。。。
晚上回到家,在老婆杀人的目光中,我还是战战兢兢打开了电脑。
准备再写几个bug,测试的时候,出现了一个错误:StackOverFlow
对!就是它了!!!!
由于英文实在太蹩脚,我就直接把错误提示粘贴到了搜索框中,之后找到了这么个页面:
https://stackoverflow.com/questions/41053653/tomcat-8-is-not-able-to-handle-get-request-with-in-query-parameters
这个是回答tomcat8不能在请求url中使用“|”的问题,然后略过了我已经试过的方法,找到了一个没有试过的
这哥们跟我遇到了同样的问题卧槽!!!!然后,我就试着在Server.xml的Connector中添加了这个
relaxedQueryChars="[,]"
牛逼了,好使了。而且,根据这哥们说的,如果还有其他特殊的字符串,可以直接添加到这个属性里。
————————————————
版权声明:本文为****博主「MoriartyLiang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.****.net/Hitler698/article/details/85720156