Что вызывает исключение java.io.CharConversionException с сообщениями EOF или isHexDigit в Tomcat?

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Это исключение приводит к тому, что наша производственная система catalina регистрируется при простом вызове '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)

Или Иногда:

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)
Это было полезно?

Решение

Просто выдвигаю гипотезу.Похоже, что URL-декодирование параметров или их значений завершается неудачей (URL-кодирование означает кодирование некоторых символов с использованием обозначения %XX или % XXXX, где XX или XXXX - шестнадцатеричный код символа в ISO-8859-1 или Unicode).В первом случае ошибка может возникнуть из-за того, что после символа % недостаточно шестнадцатеричных символов.Во втором случае это может происходить из-за того, что символ после символа % не является шестнадцатеричным.

Другие советы

Еще одна вещь, которую следует изучить, - это URIEncoding в вашем Конфигурация "Соединителя" Tomcat. Если ссылка находится на странице в кодировке UTF-8, она будет кодировать URL в байты с помощью UTF-8, затем URL будет кодировать любой из необходимых байтов.Однако по умолчанию Tomcat считает, что эти байты соответствуют ISO-8859-1, что может привести к проблемам.

Обратное также может быть истинным:если страница имеет ISO-8859-1, а URIEncoding Tomcat был установлен в UTF-8, может возникнуть аналогичная ошибка.

Вот полезная дискуссия о проблемах в этой области: Подводные камни с кодировкой в контейнерах JSP / сервлетов

Я начал получать эту ошибку, когда пользователи отправляли '%' по ajax-запросу.Оказывается, я не экранировал параметры перед отправкой запроса.Полное описание этого сценария и исправления описано в этом запись в блоге

Это также может быть так (из Википедии):

Существует нестандартная кодировка для символов Юникода:%uxxxx, где xxxx - значение в Юникоде, представленное четырьмя шестнадцатеричными цифрами.Такое поведение не указано ни в одном RFC и было отклонено W3C.Третья редакция ECMA-262 по-прежнему включает функцию escape (string), которая использует этот синтаксис, а также функцию encodeURI (uri), которая преобразует в UTF-8 и кодирует каждый октет в процентах.

Таким образом, вы могли бы использовать старую escape-функцию в Javascript, но поскольку более поздние версии Tomcat более строго относятся к таким вещам (5.5.17 оставим эту кодировку в стороне), только сейчас вы начинаете видеть исключения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top