12

这个异常在我们的生产 catalina 日志中添加了一个简单的“getParameter()”调用。

警告:参数:字符解码失败。参数被跳过。

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

或者有时:

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

4 回答 4

5

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

于 2008-09-19T21:54:23.727 回答
2

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

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

以下是关于该领域问题的有用讨论:JSP/Servlet 容器中的字符集陷阱

于 2008-09-24T16:38:39.530 回答
2

当用户通过 ajax 请求发送 '%' 时,我开始收到此错误。原来我在发出请求之前并没有转义参数。此博客文章中涵盖了此方案和修复的完整记录

于 2010-08-13T03:11:10.730 回答
1

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

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

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

于 2009-04-10T15:57:24.747 回答