2008-09-19 88 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

相關問題