美文网首页
Tomcat中URL对于特殊字符返回400错误

Tomcat中URL对于特殊字符返回400错误

作者: 肖金光xjg | 来源:发表于2019-03-22 18:05 被阅读0次

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

相关文章

网友评论

      本文标题:Tomcat中URL对于特殊字符返回400错误

      本文链接:https://www.haomeiwen.com/subject/gjgrvqtx.html