0

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以外的字符。我们尝试了一些解决方案:

  1. 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="[ \ ] ^ ` { | }" />

但是,该值可以是以下字符的任意组合:" < > [ \ ] ^{ | }`,值中存在的任何其他字符都将被忽略。这意味着中文/韩文参数仍然会出错。

  1. 修改客户端,在请求api时对各个参数进行编码。
    可以解决问题,但是好像不可行,因为我们不能修改所有的客户端,比如发布的APP不能修改。

有什么好的通用解决方案吗?我希望可以更改一些 tomcat 配置,使其在 GET 参数中支持中文/韩文字符。

4

0 回答 0