Tomcat从7.0升级到8.5后,发现GET请求参数中如果包含中文或韩文字符,tomcat会抛出IllegalArgumentException: Invalid character found in the request target。
org.apache.coyote.http11.Http11Processor service
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.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:479)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
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不再支持RFC 7230和RFC 3986以外的字符。我们尝试了一些解决方案:
relaxedQueryChars
在server.xml中根据 配置
<Service name="Catalina">
<Connector port="10001" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="1024"
minSpareThreads="64"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
maxHttpHeaderSize="65536"
maxPostSize="-1"
maxParameterCount="10000"
bindOnInit="false"
relaxedPathChars="[ \ ] ^ ` { | }"
relaxedQueryChars="[ \ ] ^ ` { | }" />
但是,该值可以是以下字符的任意组合:" < > [ \ ] ^
{ | }`,值中存在的任何其他字符都将被忽略。这意味着中文/韩文参数仍然会出错。
- 修改客户端,在请求api时对各个参数进行编码。
可以解决问题,但是好像不可行,因为我们不能修改所有的客户端,比如发布的APP不能修改。
有什么好的通用解决方案吗?我希望可以更改一些 tomcat 配置,使其在 GET 参数中支持中文/韩文字符。