taglibs tag standard librerias library for descargar java tomcat tomcat8 tomcat8.5

java - tag - Tomcat 8 no puede manejar la solicitud de obtención con ''|'' en los parámetros de consulta?



oracle jstl (6)

Estoy usando Tomcat 8. En un caso, necesito manejar una solicitud externa proveniente de una fuente externa donde la solicitud tiene parámetros donde está separada por | .

La solicitud se ve así:

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

En este caso obtengo el siguiente error.

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)

EDITAR 1

Funciona con Apache Tomcat 8.0.30 pero no con Tomcat 8.5


Desde Tomcat 7.0.76 , 8.0.42 , 8.5.12 puede definir la propiedad requestTargetAllow para permitir caracteres prohibidos.

Agregue esta línea en su catalina.properties

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


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 aplicación.

server.tomcat.uri-encoding = utf-8


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

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


Escápalo. El símbolo de tubería es uno que se ha manejado de manera diferente a lo largo del tiempo y entre navegadores. Por ejemplo, Chrome y Firefox convierten una URL con canalización de manera diferente al copiarlos / pegarlos. Sin embargo, lo más compatible y necesario con Tomcat 8.5 parece ser escapar:

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


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

  • Tomcat 7.0.73 , 8.0.39 , 8.5.7

Para solucionarlo, realice una de las siguientes acciones:

  • establezca relaxedQueryChars para permitir este personaje (recomendado, consulte la respuesta de Lincoln )
  • requestTargetAllow opción requestTargetAllow (en desuso en Tomcat 8.5) ( consulte la respuesta de Jérémie ).
  • puede cambiar a una de las versiones anteriores (no recomendado - seguridad)

Según el changelog de changelog , 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 sean tokens (como lo requiere RFC 7231) sean rechazadas con una respuesta 400

Tomcat 8.5.7:

Agregue comprobaciones adicionales de caracteres válidos al análisis de la línea de solicitud HTTP para que las líneas de solicitud no válidas se rechacen antes.

La mejor opción (siguiendo el estándar) : desea 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 consulta cadena:

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

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


Problema: Tomcat (7.0.88) arroja la siguiente excepción que conduce a 400 - Solicitud incorrecta.

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986.

Este problema está ocurriendo en la mayoría de las versiones de tomcat desde 7.0.88 en adelante.

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

Tomcat aumentó su seguridad y ya no permite corchetes en bruto en la cadena de consulta. En la solicitud tenemos [,] (corchetes) para que el servidor no procese la solicitud.

Agregue el atributo relaxedQueryChars bajo la etiqueta en server.xml (% TOMCAT_HOME% / conf):

<Connector port="80" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="443" compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml" relaxedQueryChars="[,]" />

Si la aplicación necesita más caracteres especiales que no son compatibles con tomcat de forma predeterminada, agregue esos caracteres especiales en el atributo relaxedQueryChars de relaxedQueryChars , separados por comas como se relaxedQueryChars anteriormente.