Что вызывает исключение java.io.CharConversionException с сообщениями EOF или isHexDigit в Tomcat?
Вопрос
Это исключение приводит к тому, что наша производственная система 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 оставим эту кодировку в стороне), только сейчас вы начинаете видеть исключения.