22

これは、GlassFish 3.1 で、Mojarra 上の PrimeFaces を使用し、MyFaces CODI でソルト処理されています。ほぼすべてのリクエストで、次のメッセージが表示されます。

警告: PWC4011: 要求パラメーターが既に読み取られているか、または ServletRequest.getReader() が既に呼び出されているため、コンテキスト /com.myapp_war_0.1 から要求文字エンコーディングを UTF-8 に設定できません

これは、私がプロジェクトを開始して以来ずっと起こっています。これまでのところ、私はそれを無視してきましたが、今では、それについて読むのに多くの時間を無駄にしていることに気付きました. ここで興味深いが不完全な回避策を見つけましたが、理解できません。

他の可能な警告メッセージを抑制せずに、このメッセージを抑える方法を誰かが提案できますか?

4

1 に答える 1

41

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.xmland と呼ばれて<sun-web-app>いました)

これは GlassFish に固有のものであり、webapp を別のサーバーにデプロイするとすべてが機能しないことに注意してください。標準的なサーバーに依存しないアプローチは、メソッドで基本的に次のジョブを実行するサーブレット フィルターを作成することです。doFilter()

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

HTTP 要求パラメーターを収集する必要がある他のフィルターの前にマップされていることを確認してください。


更新: GlassFish が事前に設定した理由については、PrimeFaces が原因である可能性があります。この関連する質問も参照してください: PrimeFaces 入力コンポーネントを介して取得された Unicode 入力が破損します

于 2011-10-04T12:32:40.503 に答える