¿Qué causa java.io.CharConversionException con mensajes EOF o isHexDigit en Tomcat?

StackOverflow https://stackoverflow.com/questions/105551

  •  01-07-2019
  •  | 
  •  

Pregunta

Esta excepción aviva nuestros registros de producción de Catalina en una simple llamada 'getParameter()'.

WARNING: Parameters: Character decoding failed. Parameter skipped.

java.io.CharConversionException: EOF
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:82)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)

O algunas veces:

java.io.CharConversionException: isHexDigit
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:87)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)
¿Fue útil?

Solución

Sólo estoy formulando una hipótesis aquí.Parece que falla la decodificación de URL de los parámetros o sus valores (la codificación de URL significa codificar algunos caracteres usando la notación %XX o %XXXX, donde XX o XXXX es el código hexadecimal del carácter en ISO-8859-1 o Unicode).En el primer caso, el error podría deberse a que no hay suficientes caracteres hexadecimales después del carácter %.En el segundo caso, esto podría deberse a que un carácter después del carácter % no es hexadecimal.

Otros consejos

Otra cosa a investigar es la codificación URIEncoding en su Configuración del "Conector" de Tomcat. Si el enlace está en una página codificada en UTF-8, codificará la URL en bytes con UTF-8 y luego la URL codificará cualquiera de los bytes que lo necesiten.Sin embargo, de forma predeterminada, Tomcat cree que esos bytes son ISO-8859-1, lo que puede generar problemas.

Lo inverso también puede ser cierto:si la página es ISO-8859-1 y la codificación URIEncoding de Tomcat se ha configurado en UTF-8, podría producirse un error similar.

Aquí hay una discusión útil sobre los problemas en esta área: Errores de Charset en contenedores JSP/Servlet

Comencé a recibir este error cuando los usuarios enviaban '%' a través de una solicitud ajax.Resulta que no estaba escapando de los parámetros antes de realizar la solicitud.En este artículo se incluye una descripción completa de este escenario y su solución. entrada en el blog

También podría ser esto (de Wikipedia):

Existe una codificación no estándar para caracteres Unicode:%uxxxx, donde xxxx es un valor Unicode representado como cuatro dígitos hexadecimales.Este comportamiento no está especificado en ningún RFC y ha sido rechazado por el W3C.La tercera edición de ECMA-262 todavía incluye una función de escape (cadena) que usa esta sintaxis, pero también una función encodeURI (uri) que convierte a UTF-8 y codifica porcentualmente cada octeto.

Por lo tanto, podría estar usando la antigua función de escape en Javascript, pero dado que las versiones posteriores de Tomcat son más estrictas con este tipo de cosas (5.5.17 deje pasar esta codificación), recién ahora está comenzando a ver excepciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top