【问题标题】:How to solve "Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]"?如何解决“在 HTTP 协议 [HTTP/1.10x0aHost:] 中发现无效字符”?
【发布时间】:2020-11-20 20:42:55
【问题描述】:

我将 SpringBoot 项目部署到 AWS EC2 实例后,经常出现异常:

2020-07-31 01:56:21.487 DEBUG 7340 --- [nio-8080-exec-1] o.a.tomcat.util.net.SocketWrapperBase    : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@3d89313d:org.apache.tomcat.util.net.NioChannel@11d95ea0:java.nio.channels.SocketChannel[connected local=/172.31.38.151:8080 remote=/198.98.61.139:33842]], Read from buffer: [0]
2020-07-31 01:56:21.487 DEBUG 7340 --- [nio-8080-exec-1] org.apache.tomcat.util.net.NioEndpoint   : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@3d89313d:org.apache.tomcat.util.net.NioChannel@11d95ea0:java.nio.channels.SocketChannel[connected local=/172.31.38.151:8080 remote=/198.98.61.139:33842]], Read direct from socket: [175]

2020-07-31 01:56:21.487  INFO 28770 --- [nio-8080-exec-4] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]
        at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
        at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

它不会破坏项目,并且每个功能都运行良好。 但是不知道以后会不会出问题,所以想现在解决。

谁能给我一些关于导致此异常的原因的提示吗?

【问题讨论】:

  • 0x0a 是一个换行符,如果有帮助的话
  • 您是否正在向 apache 发送 SSL 流量,并且 apache 没有配置私有 SSL 证书来解密它?
  • @ArunK 其实我不太明白你说的,因为我还很初级。这个项目是一个用于发送电子邮件的 api。 api 收到请求时不会发生异常。相反,它发生在没有“手动”发送请求时。我在代码中又添加了 2 行。希望这有助于解释这个问题。所以,回答你的问题,我不知道我发送的请求是否是 SSL 流量,但即使是,它们也不会导致异常。
  • 这个项目现在在 EC2 上是否可以公开访问?您是否经常收到此错误日志条目,但一切仍然正常?如果两者都是真的,您是否可能只是从四处窥探的人那里得到查询?我有时会在我的网络服务器上得到这些。他们会发送错误请求以尝试查找系统中的漏洞,这会触发我的日志中的错误。您能否将这些错误追溯到触发错误请求的 IP?
  • @DavidTran 我刚刚检查了有问题请求的发件人的 IP 地址,但不是我。前 2 行代码显示 IP。我认为您是对的,此异常是由四处窥探的人的查询引起的。谢谢!

标签: java html spring-boot tomcat


【解决方案1】:

我遇到了同样的问题,发现它与版本 8.5.44 中引入的对 Tomcat 8.5 的更改有关。对此的描述是Fix: 63578: Improve handling of invalid requests so that 400 responses are returned to the client rather than 500 responses. (markt) (http://tomcat.apache.org/tomcat-8.5-doc/changelog.html#Tomcat_8.5.44_(markt))

在这种情况下,一些向 HTTP GET 端点发出手动请求的遗留代码发送如下内容:

"GET " + path + " HTTP/1.1\n"

这需要改为:

"GET " + path + " HTTP/1.1\r\n" 解决问题。

将详细信息放在这里以供将来有相同问题的其他人参考。 Tomcat 会修复此问题以使其更合规,这可能会破坏未做正确事情的遗留代码。

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 2020-12-28
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多