【问题标题】:SpringBoot - Error parsing HTTP request headerSpringBoot - 解析HTTP请求头时出错
【发布时间】:2018-03-14 09:23:59
【问题描述】:

我正在运行SpringBoot Application,刚刚检查了服务器日志并收到了几个这样的错误。我不明白是什么原因导致的,因为错误每天都会在 12/24 小时后出现。

8.5.11 上运行的 Tomcat 版本

2018-03-04 17:03:26 [http-nio-8080-exec-85] INFO  o.a.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 method name. HTTP method names must be tokens
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:421)
    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:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    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:748)

【问题讨论】:

  • 从提供的信息中无法判断 - 您需要捕获导致它的请求以及错误发生时的实际标头值。
  • 如果您尝试通过 https 访问不安全的页面,可能会出现此错误。
  • @hovanessyan 是的,这就是在这里发布它的原因,它只出现在生产中,我不认为它是由某人的电话引起的,因为它以相同的间隔发生。
  • @MishoJaniashvili - 在没有上下文的情况下发布生产日志不会导致任何结果,然后猜测可能导致错误的原因 - “解析错误将在 DEBUG 级别记录” - 我建议在生产中打开 DEBUG未来 24 小时

标签: java spring spring-boot


【解决方案1】:

这可能是因为解析的是 HTTPS 标头而不是 HTTP。试试:

  1. 添加:
    logging.level.org.springframework.web: trace
    logging.level.org.apache: trace
    到你的 application.properties 看看 Spring 对你说了什么。
  2. 检查当时是否有任何计划的活动引用其他通过 SSL 加密的资源。另请参阅:java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens

【讨论】:

    【解决方案2】:

    正如我在this similar question 中回答的那样,请检查您是否不小心使用 HTTPS 协议而不是 HTTP 协议进行请求。如果你没有在 Tomcat 上配置 SSL 并且你发送 HTTPS 请求,它会导致这个奇怪的消息..

    【讨论】:

      【解决方案3】:

      我在配置为在端口 8443 上提供 HTTPS 并将端口 8080 HTTP 流量重定向到端口 8443 的 Spring Boot 2 (2.0.1.RELEASE) 应用程序中遇到此错误。

      在 Microsoft Edge 上,应用程序按预期工作,http://localhost:8080 重定向到 https://localhost:8443。然而,在 Chrome 66 上,这只会工作一次,然后 Chrome 会抱怨“本地主机发送了无效响应”(ERR_SSL_PROTOCOL_ERROR)。

      服务器日志说: DEBUG 11440 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer: Received [ <<unprintable characters>> ] INFO 11440 --- [nio-8080-exec-1] o.apache.coyote.http11.Http11Processor: Error parsing HTTP request header

      事实证明,Chrome 将 localhost 添加到其 HSTS list 因为 Spring Boot 发回了一个 Strict-Transport-Security: max-age=31536000 ; includeSubDomains 标头 https://localhost:8443。所以本质上,这个问题的发生是因为客户端(即浏览器)试图通过 HTTPS 与 HTTP 端点通信。

      在中添加.headers().httpStrictTransportSecurity().disable(); &lt;? extends WebSecurityConfigurerAdapter&gt;.configure 修复了该问题,如 this StackOverflow question 中所述。

      【讨论】:

      • 这不是我来这里试图解决的错误的解决方案,但它是我遇到的另一个错误的解决方案。我们运行我们所有的 8080 和 8443 应用程序以确保安全。最近用户一直在抱怨他们无法连接。他们的浏览器会在 :8080(非安全连接器端口)上自动转发到 https。我猜是因为我们一直在转换为弹簧靴。
      【解决方案4】:

      告诉你我用 Firefox 代替 chrome 解决了什么问题。

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多