【问题标题】:java.lang.IllegalArgumentException: Invalid character (CR or LF) found in method namejava.lang.IllegalArgumentException:方法名称中发现无效字符(CR 或 LF)
【发布时间】:2016-10-16 14:59:01
【问题描述】:

我有一个在 Tomcat8 上运行的 Spring MVC 应用程序。一两天内,我的日志文件中出现异常

15-Jun-2016 10:43:39.832 INFO [http-nio-8080-exec-50] org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character (CR or LF) found in method name
    at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:228)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458)
    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)

有人知道这可能是什么吗?

【问题讨论】:

  • 看起来传入的 HTTP 请求标头格式错误。正如错误消息告诉您的那样,请求标头在 HTTP 方法名称(行尾)中包含禁止字符,因此请求解析器失败并出现异常。因此,这不是您的代码中的问题。您可以忽略它或要求发件人检查请求的有效性。
  • @Vladimir Vagaytsev - 请求来自 Web,我们使用 nginx 设置了 LB。在服务器上,它会抛出上述错误并抛出 Bad Gateway。 scalescale.com/tips/nginx/502-bad-gateway-error-using-nginx 没有帮助:(
  • 我相信,这个例外与 SSL 设置有关,因为相同(嗯,几乎相似)的战争在舞台机器上工作 - 我们使用 http 访问 - 而测试生产设置(使用https)是我们面临这个问题的地方。必须检查我们的 nginx 配置。以防万一,您找到了解决方法 - 请告诉我 :)
  • 嗨VadOs,你的tomcat是在云机上运行的吗?如果是,请参考 - (cyber4.org/three-legged-pig/…) 和 (confluence.atlassian.com/confkb/…)
  • 小伙伴们,你们有进步吗?

标签: java spring-mvc ubuntu tomcat8


【解决方案1】:

只需在 springboot 中添加这个问题。 我使用的是 HTTPS url,但我的本地服务器没有使用 SSL,所以我将 url 切换为 HTTP 并且它可以工作。

【讨论】:

    【解决方案2】:

    此错误是由格式错误的 HTTP 请求引起的。 在大多数情况下,此消息具有误导性,因为此错误通常发生在您尝试通过 https 访问不安全页面时。 Tomcat 不知道传入的请求是加密的,并试图将此请求解释为普通的、不安全的 http 请求。

    这是它在日志中的样子:

    标准、正确的 HTTP 请求 (http://localhost:8080)

    Received [GET /index.html HTTP/1.1
    Host: localhost:8080
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: pl,en-US;q=0.8,en;q=0.6
    Cookie: Idea-xxxxx; JSESSIONID=3dxxxxx
    
    ] 
    

    HTTPS 请求 (https://localhost:8080)

    Received [¹µHÄ;ß!P@<¿
                                                                                                                                    #|vFBb-Ëiø/5
    jÿ
    
                       hhttp/1.1uP
                                   
    ] 
    

    正如您在第二个请求中看到的,存在未知字符而不是正确的 HTTP 方法名称(例如 GET)

    因此,如果您的服务器没有 SSL 配置并且“一两天一次”发生错误,那么可能有人正试图通过 https(可能是某种机器人)访问您的网站

    最终有人试图发送不安全但格式错误的纯 HTTP 请求(通过他自己的应用程序 - 机器人或其他自定义客户端)。

    【讨论】:

    • 这个错误是否会导致 tomcat 停止工作??我多次收到此异常,并且我的 tomcat 定期停止...
    【解决方案3】:

    这个错误可能是因为端口坏了。

    实际上,注意如果你想接受 throw HTTPS,默认的 Tomcat 端口是 8443 : https://localhost:8443

    当您更改连接器和密钥库但仍使用 8080 而不是 8443 获取时

    【讨论】:

    • 这是很好的事实信息,但它并没有以回答手头问题的方式编写。请删除此答案并将其作为评论添加到最合适的答案中。
    • 我不同意。我发布此评论是因为端口错误导致我遇到完全相同的错误
    • 没关系,但请重写您的答案,以某种方式包含该问题。您的回复也可能是“请注意,如果您想接受 throw HTTP,默认 Tomcat 端口是 8080”,它将包含相同的信息:有关默认端口的信息。没有将这些信息与他的问题联系起来,这就是为什么我说它不能回答这个问题。事实是正确的,但说 FTP 的默认端口是 21 也是事实。在您说明事实和问题之间的关系之前,您不是在回答问题,您只是在说事实。
    【解决方案4】:

    重新检查发送的请求。 如果端点未启用 https,请使用 http 传递请求。

    【讨论】:

      【解决方案5】:

      HTTP POST 请求也遇到了同样的问题——问题是“JSON 数据不正确”。我在类中有一个枚举属性,我在对象中传递了错误(拼写错误)。我得到了这个例外。

      【讨论】:

        【解决方案6】:

        我遇到了同样的错误,它与您的 Tomcat 配置完全无关。它让我疯狂地试图找到错误。我正在为来自六个域的多个应用程序提供服务,其中只有一个域产生代理错误 502。然后在 Tomcat 的日志 catalina.out 中找到“无效字符”消息:

        Apr 18, 2018 10:31:06 AM org.apache.coyote.http11.AbstractHttp11Processor process
        INFO: Error parsing HTTP request header
         Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
        java.lang.IllegalArgumentException: Invalid character (CR or LF) found in method name
                at org.apache.coyote.http11.InternalAprInputBuffer.parseRequestLine(InternalAprInputBuffer.java:177)
                at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:992)
                at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
                at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2454)
                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.lang.Thread.run(Thread.java:748)
        

        就我而言,我使用代理从 Apache httpd 向 Tomcat 应用程序发送请求。代理指令在 httpd 的虚拟主机中使用,通常在 /etc/httpd/conf.d/virtualhosts.conf 中配置。代理首先将端口 80 上收到的任何未加密的 http 请求重定向到端口 443。

        <VirtualHost *:80>
          ServerName www.domain1.com
          ServerAlias domain1.com *.domain1.com
          Redirect permanent / https://domain1.com/
        </VirtualHost>
        

        然后将重定向的请求作为正常传入的加密 https 请求进行处理。

        配置不正确。请勿复制!

          <VirtualHost *:443>
              ServerName www.domain1.com
              ServerAlias domain1.com *.domain1.com
              ProxyRequests off
              ProxyPreserveHost on
              CustomLog "/etc/httpd/logs/domain1ssl.log" "%h %l %u %t \"%r\" %>s %b"
              ErrorLog "/etc/httpd/logs/domain1ssl_error.log"
              SSLEngine on
              SSLProxyEngine on
              SSLCertificateFile /etc/pki/tls/certs/domain1.com.crt
              SSLCertificateKeyFile /etc/pki/tls/private/domain1.key
              SSLCertificateChainFile /etc/pki/tls/certs/ca-bundle-domain1.crt
              ProxyPass / https://domain1.com:8081/
              ProxyPassReverse / https://domain1.com:8081/
            </VirtualHost>
        

        注意这两行:

        ProxyPass / https://domain1.com:8081/
          ProxyPassReverse / https://domain1.com:8081/
        

        指令告诉 Apache 将请求作为加密请求发送到侦听端口 8081 的进程。这是我的错字。协议应该是http。 Tomcat 不处理加密,httpd 处理加密。因此,Tomcat 在未加密的连接器上接收到加密请求,导致“无效字符”错误在 Maciej Marczuk (https://stackoverflow.com/users/1545775/maciej-marczuk) 的回答中得到了很好的解释。非常感谢您提示我找到我的错字。

        代理指令应该是:

        ProxyPass / http://domain1.com:8081/
          ProxyPassReverse / http://domain1.com:8081/
        

        希望这对某人有所帮助。 干杯。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          • 2019-05-19
          • 1970-01-01
          • 2017-11-06
          • 1970-01-01
          相关资源
          最近更新 更多