2014年6月30日月曜日

ServletのFilterで文字コードを統一する

Servletにおいては、リクエストボディの文字コードの指定とレスポンス(出力)の文字コードの指定を

のように指定しますが、各Servletで個別に設定するのは保守の観点からよくないです。 

ですので、システム全体で一カ所で指定したいということになります。
これを行うにはServletのFilterインタフェースで実装することができます。

FilterインタフェースはServletの実行の前後に呼び出され、Servletに渡す種々の値に加工や絞り込み、値による認証等を行ったり、Servletの実行結果を加工してクライアントに送るといった事等を行うことができます(まさにフィルターです)。


initとdestroyの両メソッドは初期化処理と終了処理としてコールされます。マルチスレッド環境(つまりはServlet環境)では、initが最初のスレッドがこのフィルタを使うシステムにアクセスしたタイミングで、destroyがこのフィルタが全てのスレッドからの参照を失って廃棄されるタイミングでそれぞれ一度だけコールされるため、マルチスレッドに対応した仕組みになっています。ここではinitにおいてweb.xmlにキー"encoding"で設定された値をFilterConfigオブジェクトを使って読み出し、privateフィールドのencodingにセットしています。destroyではこの例では何も処理を行っていません。

doFilterメソッドはリクエストの度にコールされるこのフィルターの本体です。
ここで、initメソッドで得たencodingの値を使って文字コードを設定する事で個別のServletに文字コードを指定せず、一元化することができます。
responseのContent-Type="text/html"のcharsetにも指定した文字コードを渡しています。これによって出力の文字コード変換が行われ、同時にサーバ(Servlet)側からクライアント(主にブラウザ?)に使用している文字コードを明示的に伝える事ができます。そんなサーバの指示を無視して勝手に動くクライアントもいますが(^^;;

ちなみに、web.xmlには以下のように記述します(例では文字コードをShift_JISとしています)。


参考)
 ・http://www.ne.jp/asahi/hishidama/home/tech/java/j2ee/filter.html
 ・サーブレットで文字化けに対応する方法
 ・Servlet/JSPで漢字を扱う

0 件のコメント:

コメントを投稿