有效字符在RFC 7230和RFC 3986中有定义。

31

我的程序在线上抛出了这个异常,我知道为什么它是错的。我的问题是如何找到错误的位置,Java无法捕获此异常的位置。如何获取有关此异常的其他信息,例如请求地址的错误API。

错误消息如下:

2019-01-18  07:49:23.076 [http-nio-127.0.0.1-8081-exec-96] INFO  org.apache.coyote.http11.Http11Processor - 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:484)
    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:800)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

2
似乎在这个类 https://github.com/apache/tomcat/blob/trunk/java/org/apache/coyote/http11/Http11InputBuffer.java#L386 中有调试语句。当您启用名称为 org.apache.coyote.http11.Http11InputBuffer 的调试记录器时,您应该能够看到问题所在。 - rkosegi
由于它是在线的,调试模式未开启。 - Leandy
5个回答

26

如果您使用Tomcat 8.5的更高版本,当URL路径包含“[”和“]”时,它会抛出此异常。在旧版本中,它可以正常工作。


1
是的,出现此错误是因为路径中的参数具有特殊字符。因此,在传递参数之前,我们应该对它们进行'encodeURL'编码,或者使用POST方法替换GET方法。 - Leandy
是的,在我的情况下,我忘记使用encodeURIComponent()。我在对象上使用了JSON.Stringify(),但这并不足够。当我看到这个问题时,我立刻意识到自己的错误。 - Interesting

15

解决方法是在Tomcat的server.xml文件中的HTTP连接器端口添加以下属性:

relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`"<>"

1
relaxedQueryChars='[]|{}^`"<>' 应为返回的翻译文本。 - Brian Tingle
版本9.x.x中不允许使用尖括号。 - Binoy Cherian
1
我在我的server.xml中添加了relaxedPathChars和relaxedQueryChars,但是在Internet Explorer中仍然出现相同的错误。我的Tomcat版本是9.0.58。 - demir5334
1
我的Tomcat抱怨答案和上面的评论中有非法字符。如果您遇到相同的问题,请考虑使用relaxedPathChars="[]|"relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" - Maksim Vi.

4
错误信息显示“请求目标中发现无效字符”。这意味着HTTP客户端发送了一个包含无效字符的资源请求。服务器无法解析该请求,因为请求不符合HTTP协议规范。
这是客户端问题,请修复客户端。
如果这是一个公共服务器,可能有人试图通过发送格式不正确的请求来攻击它(这很常见)。

问题是在线服务器抛出的异常,本地测试中没有遇到这个问题。 - Leandy

3

当我使用AJAX GET请求发送文件位置时,遇到了相同的错误。

由于位置中包含无法识别的字符,例如"C:///"等,因此会抛出错误。

使用encodeURIComponent可以帮助我解决这个问题,因为它对组件进行编码。

当您传递位置时,请确保将其添加到"encodeURIComponent"方法中。在我的情况下:

 $.ajax({
        type: "GET",
        url: 'removeFile?removeFilePath=' + encodeURIComponent("C:///YO/Ed/PO/")
        data: {},
        dataType: 'json',

2

我使用的是Tomcat v8.5,下面的更新在server.xml中适用于我,因为“<>”不被允许。

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^`'"/>

是的,这在Tomcat 8.5中对我有效。 - gene b.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接