2012-02-03 16 views
3

リモートサービスは、ISO-8859-15でエンコードされたRequestを使用してJetty Serverを呼び出します。この特別な要求は、Spring Controllerにマップされます。桟橋は、右のようにして、要求をエンコードすることができず、次の例外を示しています

exception=org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte F6 in state 3} 
org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! byte F6 in state 3 
    at org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:168) ~[na:na] 
    at org.eclipse.jetty.util.Utf8Appendable.append(Utf8Appendable.java:93) ~[na:na] 
    at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:506) ~[na:na] 
    at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:554) ~[na:na] 
    at org.eclipse.jetty.server.Request.extractParameters(Request.java:285) ~[na:na] 
    at org.eclipse.jetty.server.Request.getParameter(Request.java:695) ~[na:na] 
    .... 

ソリューション

春ではあってもCharacterEncodingFilterを通じてリクエストの符号化を強制することが可能ですアプリケーション全体がUTF-8を話します。例外は消滅するはずです。この場合は

<filter> 
    <filter-name>encoding-filter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>ISO-8859-15</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>encoding-filter</filter-name> 
    <url-pattern>/app/specialRequest.do</url-pattern> 
</filter-mapping> 

はあなたのために働いていない

  • リモートシステムエンコーディングを見つける
  • 開始Wiresharkのip.src == xxx.xxx.xxx.xxxフィルタ
  • を通じて入ってくるパッケージを分析します
  • 特殊文字(16進値をバイナリに再計算し、頻繁に使用されるいくつかのエンコーディングを試して例外にマッチしたものを正確に探してください)
  • は、Jettyのstart.iniによってエンコードを設定します。

Dorg.eclipse.jetty.util.UrlEncoding.charset = ISO-8859-15

Dorg.eclipse.jetty.util.URI.charset = ISO-8859-15、次のパラメータを持ちます

他にも質問がある場合は、メッセージを削除してください。

+0

実行していたバージョンはどれですか?もしそれが以前のバージョンの8.0だったら、それらのバージョンの変更を見て、何かがポップアップするかどうかを確認することができます。 – Tim

+0

これは、jetty-7.4.2.v20110526でした。しかし、私はこのエラーがJettyのものであると100%確信していません。私はjetty7版でもう一度(同じケース)テストします。私は途中です... –

+0

うん、Jetty7で、私はIllegalArgumentExceptionを取得します:!utf8 on org.eclipse.jetty.util.Utf8Appendable.appendByte(Utf8Appendable.java:130)。同じように見えるが、他の言葉で。 「外部」から来て、私の移行から独立した新しい問題のようです。私はあなたが何か新しいものに変わるときに、そして同じ瞬間に何か他のものが現れるようになるとき、それらの問題を嫌う。 –

答えて

4

クライアントがUTF8としてエンコードする必要があるテキストを送信しているようですが、エンコードしていないようです。

適切にあなたがUTF8理解する必要があります。この問題を診断するためにはUTF8に

127(0x7Fを)のエンコーディングを持つ任意の文字(あなたがするかもしれない、私は知らない)以下 - をすなわち最低7ビットのみが使用されます - のように(特別なエンコーディングなし)に含まれます。しかし、127を超えるもの(すなわち、第7ビットよりも少なくとも1ビット高いもの)が特別に符号化される。

0xF60x7Fより大きいため、クライアントがその文字を送信したい場合は、それをエンコードする必要があります。バイナリで

0xF6 UTF8にそう11000011 10110110C3 B6

であるべき、11110110あるクライアントが0xF6のISO8859-1文字を送信したい場合、それは0xC3のUTF8バイトシーケンスを送信する必要があります0xB6。

クライアントが送信したいもの、データが含まれている文字セット/エンコーディング、送信前に有効なUTF8に変換していない理由を確認する必要があります。

(「状態3」は、UTF8デコードを行うためのJettyの内部テーブルと関係していますが、この問題の診断にはあまり役立ちません。クライアントを見つけると便利です。クライアントが正しいことをしていて、JettyのUTF8デコードが間違っていると思われる場合)

+0

この包括的な答えをありがとう!今私は国家の意味についてのポイントを得る。今日の着信要求のエンコードをチェックし、あなたが正しいことを確認します。 –

+0

しかし、彼らがISOエンコードされたリクエストを送信する場合、ISOエンコーディングを使用するようにJettyに指示し、UTF-8を使用しないようにする方法はありますか? –

+0

私のサーバーに電話をかけたプロバイダーはISO-8859エンコーディングしか持っていないと思うので、Timさん、それは直接的な答えではありませんが、あなたの投稿に投票しました。 –

関連する問題