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

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

  •  01-07-2019
  •  | 
  •  

此异常通过简单的“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)
有帮助吗?

解决方案

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

其他提示

当用户通过ajax请求发送'%'时,我开始收到此错误。事实证明我在提出请求之前没有逃避参数。此场景和修复的完整记录包含在博客文章

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top