部分版本 Tomcat get 请求包含特殊字符 400

# Java  /  Tomcat

某应用在新部署的环境有个get请求报了400,而测试环境正常。排查发现请求参数中包含了特殊字符[],而测试环境Tomcat版本为 7.0.85, 新环境为 7.0.94。

错误描述

后端报错如下:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986  

解决办法(亲测)

第1步

官方建议直接使用第2步,第1步先保留作为参考。

conf/catalina.properties中最后添加2行:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}  
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true  

该方式,在所有Tomcat版本均适用。

Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,在http解析时做了严格限制。 RFC3986文档规定,请求的Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

如果要使用这些特殊字符,并不是绝对不可以。Tomcat做了限制的同时,也提供了相关配置。 即requestTargetAllow,指定了允许的特殊字符,在等号后面配|{}就行了。 如果你仅需要使用这三个字符,配置到此就OK了。重启tomcat,就能正常使用了。

不幸的是,requestTargetAllow只能配置|{}允许这三个字符,对于其他的:" < > [ \ ] ^ ` { | },在请求时,仍然拦截,如果使用了|{}之外的其他字符那就还需要第2步的配置。

第2步

conf/server.xml中的<Connector>节点中,添加2个属性:

relaxedPathChars="|{}[]"  
relaxedQueryChars="|{}[]"  

这2个属性,可以接收任意特殊字符的组合,根据需要可以自行增减。

有关官方文档说明requestTargetAllow, relaxedQueryChars


参考:https://blog.csdn.net/ljheee/article/details/82051755

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×