某应用在新部署的环境有个get请求报了400,而测试环境正常。排查发现请求参数中包含了特殊字符``[]``,而测试环境Tomcat版本为 7.0.85, 新环境为 7.0.94。
# 错误描述
后端报错如下:
```java
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](https://tomcat.apache.org/tomcat-8.5-doc/config/systemprops.html), [relaxedQueryChars](https://tomcat.apache.org/tomcat-8.5-doc/config/http.html)
---
参考:https://blog.csdn.net/ljheee/article/details/82051755
部分版本 Tomcat get 请求包含特殊字符 400