Tomcat 8 no puede gestionar la solicitud de obtención con ‘|’ en los parámetros de consulta?

Estoy usando Tomcat 8. En un caso, necesito manejar solicitudes externas provenientes de fonts externas donde la solicitud tiene un parámetro donde está separado por | .

La solicitud se ve así:

http://localhost:8080/app/handleResponse?msg=name|id|

En este caso, estoy recibiendo un error de seguimiento.

 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467) 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:789) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 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:745) 

EDIT 1

Funciona con Apache Tomcat 8.0.30 pero no con Tomcat 8.5

Este comportamiento se presenta en todas las principales versiones de Tomcat:

  • Tomcat 7.0.73 , 8.0.39 , 8.5.7

Para una solución rápida, puede degradar a una de las versiones anteriores o establecer la opción requestTargetAllow ( ver la respuesta de Jérémie ).

Según el registro de cambios , esos cambios podrían afectar este comportamiento:

Tomcat 8.5.3:

Asegúrese de que las solicitudes con nombres de métodos HTTP que no son tokens (como lo exige RFC 7231) se rechacen con una respuesta 400

Tomcat 8.5.7:

Agregue verificaciones adicionales para los caracteres válidos en el análisis de la línea de solicitud HTTP, de modo que las líneas de solicitud no válidas se rechacen antes.


Pero eventualmente quiere codificar su URL en el cliente:

 encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|") > http://localhost:8080/app/handleResponse?msg=name%7Cid%7C 

o simplemente cadena de consulta:

 encodeURIComponent("msg=name|id|") > msg%3Dname%7Cid%7C 

Le protegerá de otros caracteres problemáticos ( lista de caracteres URI no válidos ).

Desde Tomcat 7.0.76 , 8.0.42 , 8.5.12 puede definir la propiedad requestTargetAllow para permitir el uso de caracteres indefinidos.

Agregue esta línea en catalina.properties

 tomcat.util.http.parser.HttpParser.requestTargetAllow=|{} 

Escapelo. El símbolo de tubería es uno que se manejó de forma diferente a lo largo del tiempo y entre los navegadores. Por ejemplo, Chrome y Firefox convierten una URL con pipe de manera diferente cuando los copian / pegan. Sin embargo, el más compatible, y necesario con Tomcat 8.5 parece, es escapar de él:

http: // localhost: 8080 / app / handleResponse? msg = name% 7Cid% 7C

El URI está codificado como UTF-8, pero Tomcat los decodifica como ISO-8859-1. Debe editar la configuración del conector en server.xml y agregar el atributo URIEncoding = “UTF-8”.

o edite este parámetro en su application.properties

server.tomcat.uri-encoding = utf-8

El parámetro tomcat.util.http.parser.HttpParser.requestTargetAllow está en desuso desde Tomcat 8.5: tomcat official doc .

Puede usar relaxedQueryChars / relaxedPathChars en la definición de conectores para permitir estos caracteres: tomcat official doc .

Encontramos el mismo problema. Después de analizar el problema, encontró la solución. A continuación se encuentran los detalles para el problema y la solución.

Problema: Tomcat (7.0.88) lanza debajo de la excepción, lo que lleva a 400 – Solicitud incorrecta. java.lang.IllegalArgumentException: carácter no válido encontrado en el destino de la solicitud. Los caracteres válidos se definen en RFC 7230 y RFC 3986. Este problema está ocurriendo en la mayoría de las versiones de Tomcat desde la versión 7.0.88 en adelante.

Solución: (Sugerido por el equipo de Apache):

Tomcat aumentó su seguridad y ya no permite corchetes crudos en la cadena de consulta. En la solicitud tenemos [,] (corchetes) para que la solicitud del hotel no se procese por servidor.
Como solución a continuación, se deben incorporar los pasos para que funcione como se esperaba. 1. Necesitamos agregar el atributo relaxedQueryChars debajo de la etiqueta en server.xml (% TOMCAT_HOME% / conf)

   
  1. Si la aplicación necesita más caracteres especiales que no son compatibles con tomcat de manera predeterminada, entonces necesitamos agregar esos caracteres especiales en el atributo relaxedQueryChars con una coma separada como se indicó anteriormente.