URL中有特殊字符如大括号{},中括号[],^等tomcat会返回400错误
INFO: Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:194)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1052)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
由于tomcat 新版本增加一个特性: 严格按照RFT 3986规范定义了Url
Url中只允许包含
- 英文字母(a-zA-Z)
- 数字(0-9)
- -_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])
解决办法:
转义
将请求值URL编码(但是spring boot默认只会URL解码一次,二次解码需要另行添加)
更换版本
更换Tomcat为较低版本(提示:同样的问题也存在于>7.0.76, >8.0.42,>8.5.12和>9.0.0.M12)
修改配置
1.tomcat解压版/安装版
1.~/conf/catalina.properties中,找到最后注释掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow选项,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},选项是按照字符分隔为一个数组,表示放行["|","{","}"]
2.或者你可以在~/conf/catalina.properties最后一行添加org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
2.内置版(spring boot等内置的tomcat)
在启动时加入tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
实例:# java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{} demo-0.0.1-SNAPSHOT.jar