web-dev-qa-db-fra.com

java.lang.IllegalArgumentException: caractère non valide (CR ou LF) trouvé dans le nom de la méthode

J'ai une application Spring MVC s'exécutant sur Tomcat8. Une fois par jour ou deux, je reçois une exception dans mon fichier journal

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)

quelqu'un a-t-il une idée de ce que cela pourrait être?

18
VadOs

Cette erreur est due à une requête HTTP mal formée. Dans la plupart des cas, ce message est trompeur, car cette erreur se produit généralement lorsque vous essayez d'accéder à une page non sécurisée via https . Tomcat ne sait pas que la demande entrante est cryptée et tente d'interpréter cette demande comme une requête non sécurisée demande http. 

Voici à quoi cela pourrait ressembler dans les journaux:

Standard, requête HTTP appropriée ( 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

] 

Demande HTTPS ( https: // localhost: 8080 ) 

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

                   hhttp/1.1uP
                               
] 

Comme vous pouvez le constater dans la deuxième demande, il existe des caractères inconnus au lieu du nom de méthode HTTP approprié (par exemple, GET).

Donc, si votre serveur n'a pas de configuration SSL et qu'une erreur se produit "une fois par jour ou deux", il est probable que quelqu'un tente d'atteindre votre site Web via https (probablement une sorte de bot).

Finalement, quelqu'un essaie d'envoyer une requête HTTP simple, non sécurisée mais mal formée (via sa propre application - bot ou autre client personnalisé). 

33
Maciej Marczuk

Ajoutez simplement ce problème aussi avec springboot . J'utilisais une URL HTTPS mais mon serveur local n'utilisait pas SSL, alors j'ai basculé l'URL sur HTTP et cela a fonctionné.

3
Maelig

J'ai rencontré cette même erreur et cela n'a absolument rien à voir avec votre configuration Tomcat. Cela m'a rendu fou en essayant de trouver l'erreur. Je servais plusieurs applications à partir de six domaines avec un seul des domaines générant l'erreur de proxy 502. Le message "Caractère non valide" apparaît alors dans le journal catalina.out de Tomcat:

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)

Dans mon cas, j'envoie des demandes aux applications Tomcat à partir d'Apache httpd à l'aide d'un proxy. Les directives proxy sont utilisées dans l'hôte virtuel de httpd, normalement configurées dans /etc/httpd/conf.d/virtualhosts.conf. Le proxy redirige d’abord les demandes http non chiffrées reçues sur le port 80 vers le port 443.

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

La demande redirigée est ensuite traitée comme une demande https cryptée entrante normale.

La configuration incorrecte. NE PAS COPIER CECI!

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

Notez les deux lignes:

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

Les directives demandent à Apache d’envoyer la demande au processus écoutant le port 8081 en tant que demande chiffrée. C'était une faute de ma part. Le protocole devrait être http. Tomcat ne gère pas le cryptage, httpd gère le cryptage. Tomcat reçoit donc une demande chiffrée sur un connecteur non chiffré, ce qui entraîne une erreur 'Caractère non valide' parfaitement expliquée dans la réponse de Maciej Marczuk ( https://stackoverflow.com/users/1545775/maciej-marczuk ). Merci beaucoup pour m'avoir aidé à trouver ma faute de frappe. 

Les directives de proxy doivent être:

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

J'espère que cela aide quelqu'un .

1
Ted Spradley

Revérifiez la demande envoyée . Si le noeud final n'est pas activé pour https, transmettez la demande avec http.

1
Sarat Chandra

J'ai également rencontré le même problème avec HTTP POST Demande - Le problème était "Les données JSON n'étaient pas correctes". J'avais un attribut enum en classe que je passais mal (erreur d'orthographe) en objet. Et je recevais cette exception.

1
Bhupendra Kumar

Cette erreur peut survenir à cause d'un mauvais port.

En fait, notez que si vous souhaitez accepter HTTPS, le port Tomcat par défaut est 8443: https: // localhost: 8443

lorsque vous changez le connecteur et le magasin de clés mais que vous récupérez toujours avec 8080 au lieu de 8443

0
hadf