如何使Tomcat在GET参数中支持非RFC7230/RFC3986字符?
将Tomcat版本从7.0升级到8.5后,我发现如果GET请求参数中包含中文或韩文字符,Tomcat将抛出IllegalArgumentException:在请求目标中找到无效字符如何使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
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
但是,该值可以是以下字符的任意组合:“<>[\]^
{124;}”,该值中存在的任何其他字符都将被忽略。这意味着中文/韩文参数仍将出错
它可以解决问题,但似乎不可行,因为我们无法修改所有客户端,例如,发布的应用程序无法修改
有什么好的通用解决方案吗?我希望可以更改一些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="[ \ ] ^ ` { | }" />