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

信息 [http-nio-8080-exec-317] org.apache.coyote.http11.AbstractHttp11Processor.process 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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:285)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1045)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1539)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1495)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

tomcat对http头验证,当在浏览器中访问时 URL中带有特殊字符,如花括号冒号时,就会出现这个错误。

查到的这几种解决方法:

1、更换低版本tomcat。(目前用的tomcat8.0.48)

  这个就算了,不同版本tomcat存在优化差异,到时候许多配置也会更改。

2、前端http请求的时候对参数进行URL编码处理,理论上是绝对可行的

  我都没查出是那个接口报的错,因为对外提供了接口,只在tomcat日志里看到的错误,按个排查太慢了

3、使用 Post 方法提交数据

  改动太多了

4、在 conf/catalina.properties  添加或者修改:

  tomcat.util.http.parser.HttpParser.requestTargetAllow=|{} 

  我先试试这种,观察一段时间

  另一种没看懂,

修改tomcat/conf/catalina.properties的配置文件
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。
具体来说,就是添加了些规则去限制HTTP头的规范性
org.apache.tomcat.util.http.parser.HttpParser#IS_NOT_REQUEST_TARGET[]中定义了一堆not request target
if(IS_CONTROL[i] || i > 127 || i == 32 || i == 34 || i == 35 || i == 60 || i == 62 || i == 92 || i == 94 || i == 96 || i == 123 || i == 124 || i == 125) {
IS_NOT_REQUEST_TARGET[i] = true;
}
转换过来就是以下字符(对应10进制ASCII看):
键盘上那些控制键:(<32或者=127)
非英文字符(>127)
空格(32)
双引号(34)
#(35)
<(60)
>(62)
反斜杠(92)
^(94)
TAB上面那个键,我也不晓得嫩个读(96)
{(123)
}(124)
|(125)

5、使用Connector中relaxedPathChars和relaxedQueryChars属性可以解决问题.找到tomcat/conf/server.xml,在Connector中增加这两个配置.
  <Connector port="8080" protocol="HTTP/1.1" relaxedPathChars="[]{}|^" relaxedQueryChars="[]{}|^" />

  暂未尝试

参考:https://www.cnblogs.com/dygrkf/p/9088370.html

     https://www.dazhuanlan.com/2020/03/20/5e7404d60e4b3/

  

原文地址:https://www.cnblogs.com/wjq-/p/14884846.html