我正在使用Tomcat8。在一种情况下,我需要处理来自外部源的外部请求,其中该请求具有由|
分隔的参数。
请求如下所示:
http://localhost:8080/app/handleResponse?msg=name|id|
在这种情况下,我得到以下错误。
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:467)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
编辑1个
它适用于Apache Tomcat 8.0.30,但不适用于Tomcat 8.5
发布于 2016-12-15 03:18:26
在所有主要的Tomcat版本中都引入了此行为:
8.5.7,
要修复此问题,请执行以下操作之一:
将安全性设置为允许此字符(推荐,see Lincoln's answer)
requestTargetAllow
)基于changelog,这些更改可能会影响此行为:
Tomcat 8.5.3:
确保使用不是令牌的HTTP方法名的请求(根据RFC7231的要求)被拒绝,并返回400响应
Tomcat 8.5.7:
在HTTP请求行解析中添加了对有效字符的额外检查,以便更快地拒绝无效的请求行。
最佳选择(遵循标准)-您希望在客户端对URL进行编码:
encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|")
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C
或者只是查询字符串:
encodeURIComponent("msg=name|id|")
> msg%3Dname%7Cid%7C
它将保护您免受其他有问题的字符(list of invalid URI characters)的影响。
发布于 2017-05-16 23:08:31
自Tomcat 7.0.76、8.0.42、8.5.12以来,您可以定义属性requestTargetAllow
以允许禁用字符。
将此行添加到您的catalina.properties
中
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
发布于 2018-08-21 21:20:35
问题: Tomcat (7.0.88)抛出以下异常,导致400 - Bad请求。
java.lang.IllegalArgumentException: Invalid character found in the request target.
The valid characters are defined in RFC 7230 and RFC 3986.
从7.0.88开始的大多数tomcat版本都存在此问题。
解决方案:(由Apache团队建议):
Tomcat提高了它们的安全性,不再允许在查询字符串中使用原始方括号。在请求中,我们有,,因此请求不会被服务器处理。
在server.xml (%TOMCAT_HOME%/conf)下的标记下添加relaxedQueryChars
属性:
<Connector port="80"
protocol="HTTP/1.1"
maxThreads="150"
connectionTimeout="20000"
redirectPort="443"
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
compressableMimeType="text/html,text/xml"
relaxedQueryChars="[,]"
/>
如果应用程序需要更多默认情况下tomcat不支持的特殊字符,那么在relaxedQueryChars
属性中添加这些特殊字符,用逗号分隔,如上所述。
https://stackoverflow.com/questions/41053653
复制相似问题