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:
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ónrequestTargetAllow
(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.