如何使Tomcat在GET参数中支持非RFC7230/RFC3986字符?

如何使Tomcat在GET参数中支持非RFC7230/RFC3986字符?,tomcat,encoding,utf-8,rfc3986,Tomcat,Encoding,Utf 8,Rfc3986,将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 logge

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

  • 在server.xml中根据配置
    relaxedQueryChars
  • 
    
    但是,该值可以是以下字符的任意组合:
    “<>[\]^
    {124;}”,该值中存在的任何其他字符都将被忽略。这意味着中文/韩文参数仍将出错

  • 在请求api时,修改客户端并对每个参数进行编码。
    它可以解决问题,但似乎不可行,因为我们无法修改所有客户端,例如,发布的应用程序无法修改

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

    请使用一些实际的名称/值对更新您的问题在Tomcat 9.0.27上,我可以在请求参数的值内使用特定字符(如
    ^
    |
    )复制
    IllegalArgumentException
    ),但中文和韩文字符对我来说很好例如,
    myparam=여보세요和你好
    工作正常,不会抛出任何异常。(我误解了你的问题吗?)谢谢你的回答。实际上,
    myparam=여보세요和你好
    对我来说不起作用。我使用的tomcat版本是8.5.34,让我试试9.0.27[1]好吧。我不希望
    起作用,所以只需关注一个汉字参数值,它给出了
    IllegalArgumentException
    。如果你用8.5.34失败,那么我也希望用9.0.27失败。[2]也许在您的配置中添加/更改了一些东西可以解决此问题。您是否可以用有关失败web应用程序的足够信息更新您的问题,以便其他人可以尝试重现您的问题?[3]您可以尝试使用,因为它在提交前会对汉字进行编码。这可以解决您的问题吗?
    <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="[ \ ] ^ ` { | }" />