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 の文字の 16 進コードです)。最初のケースでは、% 文字の後に十分な 16 進文字がないためにエラーが発生している可能性があります。2 番目のケースでは、% 文字の後の文字が 16 進数ではないために、この問題が発生している可能性があります。

他のヒント

もう 1 つ調査すべきことは、 Tomcatの「コネクタ」の設定。 リンクが UTF-8 でエンコードされたページ内にある場合は、URL を UTF-8 のバイトにエンコードしてから、必要なバイトを URL エンコードします。ただし、デフォルトでは、Tomcat はこれらのバイトが ISO-8859-1 であると認識するため、問題が発生する可能性があります。

逆もまた真である可能性があります。ページが ISO-8859-1 で、Tomcat の URIEncoding が UTF-8 に設定されている場合、同様のエラーが発生する可能性があります。

この分野の問題については、次のような有益な議論があります。 JSP/サーブレットコンテナの文字セットの落とし穴

ユーザーが Ajax リクエストを介して '%' を送信したときにこのエラーが発生するようになりました。リクエストを行う前にパラメータをエスケープしていなかったことがわかりました。このシナリオと修正の完全な説明は、この記事で説明されています。 ブログ投稿

これも考えられます (Wikipedia より):

Unicode 文字には非標準のエンコーディングが存在します。%uxxxx。xxxx は 4 桁の 16 進数で表される Unicode 値です。この動作はどの RFC にも規定されておらず、W3C によって拒否されています。ECMA-262 の第 3 版には、この構文を使用するエスケープ(string) 関数が含まれていますが、UTF-8 に変換して各オクテットをパーセント エンコードする encodeURI(uri) 関数も含まれています。

したがって、JavaScript で古いエスケープ関数を使用している可能性がありますが、Tomcat の新しいバージョンではそのような点がより厳密になっているため (5.5.17 ではこのエンコーディングをスライドさせます)、例外が発生し始めたのは今だけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top