Java 有效字符在RFC 7230和RFC 3986中定义
我的程序在线抛出这个异常,我知道它出错的原因。 我的问题是如何找到错误的位置,Java无法捕获此异常的位置。 如何获取有关此异常的其他信息,例如,此错误请求地址的API 错误消息如下所示:Java 有效字符在RFC 7230和RFC 3986中定义,java,tomcat8,Java,Tomcat8,我的程序在线抛出这个异常,我知道它出错的原因。 我的问题是如何找到错误的位置,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: furthe
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)
错误消息显示“在请求目标中找到无效字符”。这意味着HTTP客户端发送的资源请求中包含无效字符。服务器无法分析该请求,因为该请求不符合HTTP协议规范
这是一个客户问题。修复客户端
如果是公共服务器,可能有人试图通过发送格式错误的请求(这很常见)。如果使用Tomcat 8.5的更高版本,如果URL路径包含“[”和“]”,则会引发此异常。对于较旧的版本,它可以工作。解决方法是在tomcat
server.xml
文件中向http连接器端口添加以下属性
relaxedPathChars="[]|" relaxedQueryChars="[]|{}^\`"<>"
relaxedPathChars=“[]|”relaxedQueryChars=“[]|{}^\`”
在AJAX GET请求中发送文件位置时,我遇到了相同的错误
由于该位置包含无法识别的字符,例如“C://”等,因此引发了错误
使用encodeURIComponent
帮助我解决了这个问题,因为它对组件进行了编码
传递位置时,请确保在“encodeURIComponent
”方法中添加这些位置。在我的示例中:
$.ajax({
type: "GET",
url: 'removeFile?removeFilePath=' + encodeURIComponent("C:///YO/Ed/PO/")
data: {},
dataType: 'json',
该类中似乎有调试语句。当启用名为
org.apache.coyote.http11.Http11InputBuffer
的调试记录器时,您应该能够看到出现了什么问题,因为它是联机的,调试模式没有打开。问题是联机服务器引发的异常,我在本地测试中没有此问题是的,t发生此错误是因为路径中的参数具有特殊字符。因此,我们应该在传递参数之前对其进行“encodeURL”。或者用POST方法替换GET。