285 votes

Tomcat : java.lang.IllegalArgumentException : Un caractère non valide a été trouvé dans le nom de la méthode. Les noms de méthodes HTTP doivent être des jetons

J'obtiens la trace de pile suivante lorsque je déploie mon application dans un environnement multi-serveur Apache Tomcat 8. J'obtiens cette erreur fréquemment, et il semble qu'elle bloque le thread de Tomcat :

INFO [http-nio-80-exec-4461] 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 found in method name. HTTP method names must be tokens
 at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:233)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)

Quelqu'un peut-il m'indiquer comment résoudre le problème ou limiter cette exception ? Je n'obtiens aucune référence à aucun des fichiers source de mon application. J'ai essayé de chercher sur Google, et dans l'un des liens, il est dit que vous essayez d'accéder à l'url http par https, ce qui semble peu probable. Je n'obtiens pas cette erreur lorsque l'application fonctionne sur une seule instance de Tomcat 8. Je ne l'obtiens que dans un environnement multi-serveurs.

Je partage également les balises méta que j'ai intégrées à chaque page, si cela peut aider à identifier la cause.

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
%>

<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1">

J'utilise également ce qui suit dans quelques pages, ce qui est essentiellement la même chose que ci-dessus :

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="private" />
<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache" />

Même si quelqu'un peut m'aider en donnant une direction à ma tentative de dépannage, ce sera utile, car actuellement je n'ai aucune idée de la direction à prendre.

470voto

Petar Tonev Points 1237

Cette exception peut se produire lorsque vous essayez d'exécuter HTTPS du client sur un point d'accès qui n'est pas compatible avec HTTPS. Le client chiffrera les données de la requête lorsque le serveur attend des données brutes.

4 votes

Je ne suis pas sûr de comprendre cette réponse. J'ai une application Spring Boot 1.5.1 et j'ai vu cette exception dans mon journal. Mon application ne répond à SSL que sur le port 8443 (redirigé depuis le port 443) et ne possède qu'un seul connecteur pour SSL. Voulez-vous dire que quelqu'un pourrait essayer http : au lieu de https : sur le port 443 ?

6 votes

De telles exceptions se produisent lorsqu'il y a un décalage entre ce que le serveur attend et ce qu'il obtient. Ce que vous avez dit est l'un des scénarios possibles. Peut-être y a-t-il un point d'accès dans votre serveur qui ne fonctionne pas sur https, mais quelqu'un essaie d'y accéder de cette façon ?

2 votes

Bonjour Peter... Le problème est que quelqu'un a créé une règle IP Tables pour rediriger le port 80 vers le port 8443, donc toute personne qui accède au site en utilisant http sur le port 80 provoque cette erreur. Nous avons ajouté un connecteur Tomcat pour rediriger le port 8080 vers 8443 et configuré une règle IP Tables pour transférer le port 80 vers le port 8080 et le problème a pratiquement disparu. Merci pour votre réponse !

128voto

Dev4World Points 1954

J'ai obtenu la même exception lorsque j'ai testé localement. Le problème était un schéma d'URL dans ma requête.

Changement https:// to http:// in your client url.

Probablement que ça aide.

6 votes

Bien sûr, cela fonctionne, mais notez que la communication via HTTP n'est pas sécurisée.

28voto

Shivan Sawant Points 179

Vous appelez le serveur local avec http ://localhost:8080/foo/bar. Appelez-le avec https ://localhost:8080/foo/bar. Cela résout le problème

4 votes

Vous n'aurez probablement pas https:// sur 8080. Changez l'appel à https:// localhost:8443/foo/bar - Voici l'exemple lien - Rodrigo R. Coelho

1voto

smilyface Points 122

Réponse à cette vieille question (pour d'autres qui pourraient aider)

En configurant correctement votre httpd conf, le problème sera résolu. Installez un serveur httpd, si vous n'en avez pas.

Liste de ma configuration ici.

[smilyface@box002 ~]$ cat /etc/httpd/conf/httpd.conf | grep shirts | grep -v "#"

        ProxyPass /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPassReverse /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPass /shirts http://local.box002.com:16443/shirts
        ProxyPassReverse /shirts http://local.box002.com:16443/shirts
        ...
        ...
        ...

éditez le fichier comme ci-dessus et ensuite redémarrez httpd comme ci-dessous

[smilyface@box002 ~]$ sudo service httpd restart

Et ensuite demander avec avec https fonctionnera sans exception.
Demandez également avec http sera transmis à https ! Ne vous inquiétez pas.

0voto

J'obtenais la même exception, à chaque fois qu'une page était chargée,

NFO: 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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:139)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    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)

J'ai découvert que l'une des URL de ma page était https au lieu de http, lorsque j'ai changé la même chose, l'erreur a disparu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X