此异常通过简单的“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)
答案 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让这个编码幻灯片),现在才开始看到异常。