java.lang.IllegalArgumentException: Invalid character found in the request target. The valid charact

报错:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid charact_第1张图片

 02-Feb-2021 09:08:32.817 信息 [http-nio-8080-exec-1] 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:287)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1065)
	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:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

场景出现:

postman发起一个get请求,但是参数是一个特殊字符的值:
在这里插入图片描述

解决方法一:

把参数encode一下
在这里插入图片描述
对应到前端这边,就需要把 提交数据用 encodeURI(提交的数据变量)

推荐使用这种方法。

解决方法二:

不要使用get方法,使用post方法

解决方法三:

参考自:
https://blog.csdn.net/ljheee/article/details/82051755

https://blog.csdn.net/qq_32365919/article/details/82055800

根本原因是 高版本tomcat中的新特性:就是严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。

而在这里我传入的json串 包含了 "{ }" 非法字符。

解决办法(亲测)
conf/catalina.properties中最后添加2行:
我这里放行 三个 非法字符 |{}

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

该方式,在所有Tomcat版本均适用。
解释:在执行请求时,碰到该没问题的,大多是在URL中传输Json等。尤其是用浏览器地址输入的URL死活不能包含有任何特殊字符。否则会返回400 状态码。
首先:不推荐降低tomcat版本,这等于掩耳盗铃,绝对得不偿失。
Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,在http解析时做了严格限制。

如果你仅仅 需要使用这三个字符,配置到此就OK了。重启tomcat,rebuild工程再启动,就能正常使用了。

但!

不幸的是, requestTargetAllow 只能配置|、{、} 允许这三个字符,对于其他的( 例如" < > [ \ ] ^ ` { | } .),在请求时,仍然拦截,如果使用了 |{} 之外的其他字符那怎么办呢?那就还需要如下配置:

conf/server.xml中的节点中,添加2个属性:

relaxedPathChars="|{}[],"
relaxedQueryChars="|{}[],"

这种方法上线了还要修改Tomcat,得不偿失。

建议使用第一种方法,前端使用 encodeURI() 方法。

你可能感兴趣的:(ERROR报错合集,java,tomcat)