Как заставить Tomcat поддерживать не-RFC7230 / RFC3986 символы в параметрах GET? - PullRequest
0 голосов
/ 31 октября 2019

После обновления версии Tomcat с 7.0 до 8.5 я обнаружил, что если в параметры запроса GET включены китайские или корейские символы, tomcat выдаст исключение IllegalArgumentException: недопустимый символ в цели запроса.

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

Однако значение может быть любой комбинацией следующих символов: " < > [ \ ] ^ {|} `, любые другие символы, присутствующие в значении, будут игнорироваться. Это означает, что китайские / корейские параметры все равно получат ошибку.

Модифицируйте клиентскую сторону и кодируйте каждый параметр при запросе API.
Это может решить проблему, но кажется невозможным, поскольку мы не можем изменить все клиенты, например, выпущенное приложение. не может быть изменено

Есть ли хорошее общее решение? Я надеюсь, что смогу изменить некоторые настройки tomcat, чтобы они поддерживали китайские / корейские символы в параметрах GET.

...