JSF/Facelets はデフォルトで UTF-8 を使用して HTTP リクエスト パラメータをデコードします。GlassFish 自体は、デフォルトで ISO-8859-1 を使用して HTTP 要求パラメーターをデコードします。HTTP リクエスト パラメータは 1 回だけ解析およびデコードできます。これは、リクエスト パラメータがコードによって初めてリクエストされるたびに行われますrequest.getParameter("name")
。そのため、JSF が要求パラメーターのエンコーディングを UTF-8 に設定する前に要求パラメーターが初めて要求された場合、ISO-8859-1 を使用して (誤って) 解析されます。
次のように、ビューの復元フェーズで JSF がリクエスト パラメータのエンコーディングを設定する必要がある場合は、
request.setCharacterEncoding("UTF-8");
リクエストパラメータがすでに解析されている間、GlassFish はまさにこの警告を表示します。
望ましくない結果は、これらすべての HTTP 要求パラメーターがMojibakeになる可能性があることです。フォーム データは、最初に送信され、UTF-8 を使用してエンコードされます。ISO-8859-1 のような別の文字セットを使用して UTF-8 データをデコードすると、8 ビット範囲以上の文字 (通常、それは 、 、 などの「特殊文字é
」à
ですö
。 、、、é
などÃ
でö
。
技術的には、正しい解決策は、JSF が正しいエンコーディングを設定する前にHTTP リクエスト パラメータをリクエストしないことです。基本的に、JSF の復元ビュー フェーズの前に実行されるすべてのコード (サーブレット フィルター、フェーズ リスナーなど) をチェックする必要があります。
見つからない場合、またはコードが制御できない場合は、GlassFish に代わりに UTF-8 を使用して HTTP 要求パラメーターをデコードするように指示できます。これにより、JSF が取得したいときにパラメーターを変更する必要がなくなります。彼ら。ファイルの<glassfish-web-app>
に次のエントリを追加することで、これを行うことができます。/WEB-INF/glassfish-web.xml
<parameter-encoding default-charset="UTF-8"/>
(注: ファイルとルート エントリは、以前はそれぞれsun-web.xml
and と呼ばれて<sun-web-app>
いました)
これは GlassFish に固有のものであり、webapp を別のサーバーにデプロイするとすべてが機能しないことに注意してください。標準的なサーバーに依存しないアプローチは、メソッドで基本的に次のジョブを実行するサーブレット フィルターを作成することです。doFilter()
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
HTTP 要求パラメーターを収集する必要がある他のフィルターの前にマップされていることを確認してください。
更新: GlassFish が事前に設定した理由については、PrimeFaces が原因である可能性があります。この関連する質問も参照してください: PrimeFaces 入力コンポーネントを介して取得された Unicode 入力が破損します。