2013-04-16 7 views
8

フォームの中にUTF8文字を含むフォームを送信しようとしています。 フォームは次のようになります。フォームポストとスプリングコントローラを使用したUTF-8エンコーディング

<form id="workflowPersistForm" accept-charset="UTF-8" method="post" action="/workflow-next">> 
    <input id="stateGlobal" type="hidden" value=" お問い合わせ" name="state"> 
</form> 

私のサーバーは、ベースの春です。私のweb.xmlがすでにエンコーディングフィルターを持っています

<filter> 
    <filter-name>EncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

問題はUTF-8文字がどこかで台無しになっているということです。私はコントローラーの始まりにちょうどブレークポイントを置き、キャラクターはそのポイント自体で台無しになる。また、コントローラ内でUTF8文字を生成すると、ブラウザで正しくレンダリングされます。フォームのポストでは、コントローラーは文字を正しく受信しません。

私は間違っていると思いますか?

編集:新しいページでは、データが乱されていないが、その2重にエンコードされているように見えます。 なぜそれが二重コード化されているのか理解できません。

編集2:投稿の代わりにフォームを変更すると、すべてが完全に機能します。私はポストが壊れているのか分かりません。

答えて

10

ブラウザがリクエストヘッダでのContent-Typeの一部として文字セットを送信しないように見えます(フォームの受け入れ、文字セットが設定されている場合でも)とTomcatはラテン-1などの要求の体を扱う(http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q1 )。

後で、これはLatin-1としてデコードされ、UTF-8としてエンコードされて文字化けする可能性があります。

CharacterEncodingFilterを先頭に移動し、エンコーディングを強制的にUTF-8として設定することで問題が解決されました。

+0

多くのリンクされた問題が、実際の問題はweb.xmlのフィルタの順序にありました –

1

CharacterEncodingFilter自体を削除することをお勧めします。これは、それ自体が2重エンコーディングの原因となる可能性があります。

situtationをデバッグするには、ブラウザがデータを正しくポストしているかどうかを最初に確認する必要があります。 Firebug(Firefoxの場合)またはChromeの開発ツール(F12)

おそらく、問題はサーバー側で発生している可能性があります。どのサーバーを使用していますか? Tomcatを使用する場合は、server.xmlでConnector要素にUTF-8にCharsetEncodingを設定する必要が

アップデート1:それは問題はあなたが設定されているforceEncodingがある可能性が非常に高いに見える

docs

このフィルタの通り要求が既に(「forceEncoding」=「真」)エンコーディングを指定するか、または任意 場合には、このフィルタのエンコーディングを強制しない ない場合

をその符号化を適用しますか

getを実行すると、エンコードが指定されていないので、それが機能することは意味があります。

あなたはPOSTを行うときしかし、エンコーディングがすでに適用され、その後、(それはそうです)ので、真forceEncoding =で再び適用され

+0

私はFirebugをすべてチェックしました。私がちょうどポストの代わりにリクエストをすると、すべて動作します。 – Bulbasaur

+0

更新された回答を参照 – arahant

+0

いいえ、このフィルタは実際には何もエンコードしません。要求のエンコーディングをUTF8として設定するだけです。実際には正しいことです。 – Bulbasaur

4

あなたがEncodingFilterのためのあなたのweb.xml内のfilter-mappingエントリを持っていますか?

<filter-mapping> 
    <filter-name>EncodingFilter</filter-name> 
    <url-pattern>*</url-pattern> 
</filter-mapping> 
+0

はい、マッピングは既に存在しています。 – Bulbasaur

関連する問題