"The valid characters are defined in RFC 7230 and RFC 3986" Bad Request Tomcat 8.5 y superior

Error al usar el modulo Saga Buscador VUE

08 enero 2024
Ramón Gavira Sáenz
Si estas usando el Buscador VUE, en una instalación de Tomcat 8.5 es posible que te encuentres con este fallo.

El problema

HTTP Status 400 – Bad Request
Type Exception Report

Message Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

Description The server cannot or will not process the request due to something that is perceived to be a client error 
(e.g., malformed request syntax, invalid request message framing, or deceptive request routing). Exception java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:294) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:770) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:748) Note The full stack trace of the root cause is available in the server logs.

El servidor Apache Tomcat, está filtrando las solicitudes que contienen caracteres especiales. Esto se debe a que Tomcat utiliza un estándar de codificación y URI diferente al de la mayoría de los navegadores. En otras palabras, cuando se envía una solicitud que contiene caracteres especiales a través de un navegador, Tomcat puede rechazarla porque interpreta estos caracteres de manera diferente. Esto puede causar problemas de comunicación entre el navegador y el servidor. Para resolver este problema, es posible que necesites configurar Tomcat para que permita ciertos caracteres especiales en las solicitudes.

Puedes encontrar mas informacion en las especificaciones de Tomcat 8.5

La especificación HTTP/1.1 requiere que ciertos caracteres se codifiquen como %nn cuando se usan en rutas URI. Desafortunadamente, muchos agentes de usuario, incluyendo todos los principales navegadores, no cumplen con esta especificación y usan estos caracteres en forma sin codificar. Para evitar que Tomcat rechace tales solicitudes, este atributo puede ser usado para especificar los caracteres adicionales a permitir. Si no se especifica, no se permitirán caracteres adicionales. El valor puede ser cualquier combinación de los siguientes caracteres:

" < > [ \ ] ^ ` { | }

Cualquier otro carácter presente en el valor será ignorado.

Solución: permitir a Tomcat usar esos caracteres especiales

  1. Va a <tomcat_install>/conf, haz una copia de seguridad de server.xml, y editalo
  2. Busca el conector que estes usando, normalmente http o https
  3. Añade estos parametros:
relaxedPathChars="[]|"
relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"

 

La configuracion del conector debería quedarte algo así:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxParameterCount="1000"
               relaxedPathChars="[]|"
               relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"
               URIEncoding="UTF-8"
               />

 

Espero que esto os ayude.