ガジェカツ~在宅SEのガジェット活動ブログ~

在宅SEな筆者がガジェットネタやIT、プログラミングネタを書き連ねるブログ

サーブレット・フィルタは上から順に適用されるという話

フィルタは上から順に適用されるという話。
ちゃんとサーブレットを学んだ方々にとっては当然の話だと思います。
ちなみにJava1.7+Spring MVCでの開発を前提とした話です。

社内で開発中のWebアプリにおいて、ファイルアップロード時に文字化けが発生するというトラブルが起きた。
どうやらFormタグのenctype属性を「multipart/form-data」にした際にサーブレットが勘違いをして文字コードをISO-8859-1と思ってしまうのが、
問題のようだった。
このトラブルが起きたのは数か月前、その際は場当たり的に、

new String(formData.getComment().getBytes("iso-8859-1"), "utf-8")

という風に1フィールドずつUTF-8に戻していた。


つい最近、個人的な開発でこのトラブルに遭遇した際に調べなおしたら、web.xmlに「characterEncodingFilter」フィルタを追加すると解決するという記述*1があったため、試してみたら文字化けは解決しなかった。
最初、私はネットに書いてあった記述をそのままweb.xmlの下部に追記する形で利用していた。
ふと思い立ってフィルタの中でもっとも最上部に移動させてみたら、あら不思議文字化けは解消したという話。


サーブレット・フィルタの仕組みを考えれば至極当然のことだった。
ファイルアップロードを担うMultipartFilterの下でcharacterEncodingFilterを記述していても、
MultipartFilterを通って文字化けしたコードに対いて文字コード変換が行われるだけで、
まったくもって意味がなかったのだった。


こういうのは根っこの技術を学んでおらず、業務の一環で技術を学ぶSE・プログラマーが遭遇するトラブルかなと思います。
特にSpringフレームワークのような色々な部分が外部ファイルで設定できるものでは、
設定の記述順序が重要になるというのは考えれば当然ですが、遭遇してみないと気づきませんでした。