某应用在新部署的环境有个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
评论区