2008-09-19 85 views
11

这个异常让我们的产品catalina登录了一个简单的'getParameter()'调用。在Tomcat中导致java.io.CharConversionException与EOF或isHexDigit消息的原因是什么?

 
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) 

回答

5

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

+1

谢谢,我在我们的测试环境中证实了这种情况。值得注意的是它不会影响整个请求(其他参数像平常一样被解析并且请求像往常一样处理) – Peter 2008-09-23 00:39:29

2

另一件要调查的问题是您的URIEncoding Tomcat "Connector" configuration.如果链接处于UTF-8编码页面,它会将URL编码为UTF-8的字节,然后URL将编码任何需要它的字节。但是,默认情况下,Tomcat认为这些字节是ISO-8859-1,这可能会导致问题。

逆也可能是真实的:如果页面是ISO-8859-1,和Tomcat的的URIEncoding已被设置为UTF-8,可能会导致类似的错误。

下面是关于这方面的问题进行有益的探讨:Charset Pitfalls in JSP/Servlet Containers

1

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

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

所以,你可以使用旧的逃生功能的Javascript,但由于Tomcat的更新版本是这样的事情更严格的(5.5.17让这个编码幻灯片),只是现在你开始看到异常。

2

当用户通过ajax请求发送'%'时,我开始收到此错误。事实证明,在提出请求之前,我并没有逃避参数。这个场景和修复的完整写法在这里包括blog post

相关问题