什么导致在Tomcat中使用EOF或isHexDigit消息的java.io.CharConversionException?

时间:2008-09-19 20:55:40

标签: exception tomcat encoding

此异常通过简单的“getParameter()”调用来加密我们的生产catalina日志。

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)

4 个答案:

答案 0 :(得分:5)

这里只是假设。看起来像参数的URL解码或它们的值失败(URL编码意味着使用%XX或%XXXX表示法编码某些字符,其中XX或XXXX是ISO-8859-1或Unicode中字符的十六进制代码)。在第一种情况下,可能会发生错误,因为%字符后面没有足够的十六进制字符。在第二种情况下,这可能会发生,因为%字符后面的字符不是十六进制。

答案 1 :(得分:2)

要研究的另一件事是Tomcat "Connector" configuration.中的URIEncoding如果链接在UTF-8编码页面中,它将使用UTF-8将URL编码为字节,然后对任何需要的字节进行URL编码它。但是,默认情况下,Tomcat认为这些字节是ISO-8859-1,这可能会导致问题。

反之亦然:如果页面是ISO-8859-1,并且Tomcat的URIEncoding已设置为UTF-8,则可能会产生类似的错误。

以下是关于此领域问题的有用讨论:Charset Pitfalls in JSP/Servlet Containers

答案 2 :(得分:2)

当用户通过ajax请求发送'%'时,我开始收到此错误。事实证明我在提出请求之前没有逃避参数。此blog post

中介绍了此方案和修复的完整说明

答案 3 :(得分:1)

也可能是这个(来自维基百科):

Unicode字符存在非标准编码:%uxxxx,其中xxxx是表示为四个十六进制数字的Unicode值。任何RFC都未指定此行为,并且W3C已拒绝此行为。第三版ECMA-262仍然包含一个使用此语法的转义(字符串)函数,还包括一个encodeURI(uri)函数,它转换为UTF-8并对每个八位字节进行百分比编码。

所以你可以在Javascript中使用旧的转义函数,但由于Tomcat的后续版本对这些事情更加严格(5.5.17让这个编码幻灯片),现在才开始看到异常。