web-dev-qa-db-ja.com

警告を取り除く方法:PWC4011:要求文字エンコードをUTF-8に設定できません

これはGlassFish3.1にあり、MojarraではなくPrimeFacesを使用し、MyFacesCODIで塩漬けにしています。ほぼすべてのリクエストで、次のメッセージが表示されます。

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

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

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

22
AlanObject

JSF/Faceletsは、デフォルトでUTF-8を使用してHTTPリクエストパラメータをデコードします。 GlassFish自体は、デフォルトでISO-8859-1を使用してHTTPリクエストパラメータをデコードします。 HTTPリクエストパラメータは一度だけ解析およびデコードできます。これは、request.getParameter("name")のように、リクエストパラメータがコードによって初めてリクエストされるたびに発生します。したがって、リクエストパラメータが初めてリクエストされた場合before JSFがリクエストパラメータのエンコーディングをUTF-8に設定した場合、ISO-8859-1を使用して(誤って)解析されます。

JSFが復元ビューフェーズ中にリクエストパラメータエンコーディングを次のように設定する必要がある場合、

_request.setCharacterEncoding("UTF-8");
_

リクエストパラメータはすでに解析されていますが、GlassFishはまさにこの警告を表示します。

望ましくない結果として、これらのHTTPリクエストパラメータはすべて Mojibake になる可能性があります。フォームデータは元々、UTF-8を使用して送信およびエンコードされています。 ISO-8859-1などの別の文字セットを使用してUTF-8データをデコードする場合、8ビット範囲以上の文字(通常は_é_、_à_などの「特殊文字」) 、_ö_などが破損し、_é_、_à_、_ö_などになります。

技術的には、正しい解決策は、HTTPリクエストパラメータをnotリクエストすることですbefore JSFが正しいエンコーディングを設定しました。基本的に、サーブレットフィルタ、フェーズリスナーなど、JSFのビューの復元フェーズの前に実行されるすべてのコードをチェックする必要があります(実行されていない場合)。

見つからない場合、またはコードが制御できない場合は、代わりにUTF-8を使用してHTTPリクエストパラメーターをデコードするようにGlassFishに指示できるため、JSFが取得するときに変更する必要はありません。それら。これを行うには、_<glassfish-web-app>_ファイルの_/WEB-INF/glassfish-web.xml_に次のエントリを追加します。

_<parameter-encoding default-charset="UTF-8"/>
_

(注:ファイルとルートエントリは、以前はそれぞれ_Sun-web.xml_と_<Sun-web-app>_と呼ばれていました)

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

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

hTTPリクエストパラメータを収集する必要のある他のフィルタの前にマッピングされていることを確認してください。


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

41
BalusC