webentwicklung-frage-antwort-db.com.de

java.lang.IllegalArgumentException: Ungültiges Zeichen (CR oder LF) im Methodennamen gefunden

Ich habe eine Spring MVC-Anwendung, die auf Tomcat8 ausgeführt wird. Einmal an einem oder zwei Tagen bekomme ich eine Ausnahme in meiner Protokolldatei

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)

hat jemand eine Idee, was das sein könnte?

18
VadOs

Dieser Fehler wird durch eine fehlerhafte HTTP-Anforderung verursacht. In den meisten Fällen ist diese Nachricht irreführend, da dieser Fehler normalerweise auftritt, wenn Sie versuchen, über https .. auf eine nicht gesicherte Seite zuzugreifen http-Anfrage. 

So könnte es in Logs aussehen:

Standard, richtige HTTP-Anforderung ( 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-Anforderung ( https: // localhost: 8080 ) 

Received [¹µHÄ;ß[email protected]<¿
                                                                                                                                #|vFBb-Ëiø/5
jÿ

                   hhttp/1.1uP
                               
] 

Wie Sie in der zweiten Anfrage sehen können, gibt es unbekannte Zeichen anstelle des richtigen HTTP-Methodennamens (z. B. GET).

Wenn Ihr Server also keine SSL-Konfiguration hat und ein Fehler "einmal in zwei Tagen" auftritt, versucht wahrscheinlich jemand, Ihre Website über https zu erreichen (wahrscheinlich eine Art Bot)

Irgendwann versucht jemand, eine nicht gesicherte, aber fehlerhafte HTTP-Anforderung zu senden (über seinen eigenen Anwendungsbot oder einen anderen benutzerdefinierten Client). 

33
Maciej Marczuk

Fügen Sie dieses Problem auch einfach mit springboot ..__ hinzu. Ich verwendete eine HTTPS-URL, aber mein lokaler Server verwendete kein SSL, also habe ich die URL auf HTTP umgestellt und es hat funktioniert.

3
Maelig

Ich bin auf diesen Fehler gestoßen und kann absolut nichts mit Ihrer Tomcat-Konfiguration zu tun haben. Es hat mich verrückt gemacht, den Fehler zu finden. Ich habe mehrere Anwendungen aus sechs Domänen bereitgestellt, wobei nur eine der Domänen den Proxy-Fehler 502 erzeugte. Die Meldung "Ungültiges Zeichen" wird dann in Tomcat's Protokoll catalina.out gefunden:

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)

In meinem Fall sende ich Anfragen von Apache httpd über einen Proxy an Tomcat-Anwendungen. Die Proxy-Anweisungen werden innerhalb des virtuellen Hosts von httpd verwendet, der normalerweise in /etc/httpd/conf.d/virtualhosts.conf konfiguriert ist. Zunächst leitet der Proxy alle an Port 80 empfangenen unverschlüsselten http-Anforderungen an Port 443 um.

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

Die umgeleitete Anforderung wird dann als normale eingehende verschlüsselte https-Anforderung behandelt.

Die falsche Konfiguration KOPIEREN SIE DAS NICHT!

  <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>

Beachten Sie die zwei Zeilen:

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

Die Direktiven weisen Apache an, die Anforderung an den Prozess zu senden, der an Port 8081 als verschlüsselte Anforderung wartet. Dies war ein Tippfehler von meiner Seite. Das Protokoll sollte http sein. Tomcat behandelt keine Verschlüsselung, httpd übernimmt die Verschlüsselung. Daher empfängt Tomcat eine verschlüsselte Anforderung für einen nicht verschlüsselten Connector, was zu dem Fehler "Ungültiges Zeichen" führt, der in der von Maciej Marczuk ( https://stackoverflow.com/users/1545775/maciej-marczuk ) angegebenen Antwort außerordentlich gut erklärt wird. Vielen Dank, dass Sie mich dazu gefunden haben, meinen Tippfehler zu finden. 

Die Proxy-Direktiven sollten sein:

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

Ich hoffe, das hilft jemandem.

1
Ted Spradley

Überprüfen Sie die gesendete Anforderung erneut ... Wenn der Endpunkt nicht https aktiviert ist, übergeben Sie die Anforderung mit http.

1
Sarat Chandra

Das gleiche Problem hatte ich auch mit HTTP POST Request - Das Problem war "JSON-Daten waren nicht korrekt". Ich hatte ein Enum-Attribut in der Klasse, das ich falsch (Rechtschreibfehler) im Objekt übergeben habe. Und ich bekam diese Ausnahme.

1
Bhupendra Kumar

Dieser Fehler kann aufgrund eines fehlerhaften Anschlusses auftreten.

Beachten Sie, dass der Standard-Tomcat-Port 8443 lautet, wenn Sie HTTPS akzeptieren möchten: https: // localhost: 8443 .

wenn Sie Connector und Keystore ändern, aber immer noch mit 8080 anstelle von 8443 abrufen

0
hadf