JavaのHttpFilterクラスとdoFilterメソッドの使い方を徹底解説!初心者でもわかるServletフィルタ入門
生徒
「先生、Servletの処理の前後で何か共通の処理をしたいときって、どうやって書けばいいですか?」
先生
「そのときには、javax.servlet.http.HttpFilterクラスとそのdoFilterメソッドを使うのが便利ですよ。」
生徒
「Servletで共通処理ってどういうときに使うんですか?」
先生
「たとえば、ログインチェックやアクセスログの記録、文字コードの統一など、すべてのリクエストに対して同じ処理をしたい場合ですね。それでは、具体的に見ていきましょう。」
1. HttpFilterクラスとは何か?
javax.servlet.http.HttpFilterクラスは、JavaのServletに共通処理を追加するための仕組みです。HTTPリクエストやHTTPレスポンスに対して、決まったチェックや前処理・後処理をまとめて書きたいときに使います。たとえば、すべてのページのアクセスログを残す、ログインしているかどうかを確認する、リクエストの文字コードをUTF-8にそろえる、といった「どの画面でも毎回やりたいこと」を集中管理できます。
もしHttpFilterを使わない場合、同じようなコードを複数のServletにコピペして書くことになりがちです。そうなると、後から修正したいときに「どのクラスを直せばいいのか」がわかりにくくなり、ミスの原因にもなります。HttpFilterを使えば、こうした共通処理を1か所にまとめられるため、コードがシンプルになり、保守もしやすくなります。
■ 初心者向けのイメージ例
Webアプリの入り口に「受付係」が1人いて、次のように動いているイメージです。
- 1. ブラウザからのリクエストが来たら、まず受付係(HttpFilter)が受け取る
- 2. ログインしているか、アクセスしてよいURLかを確認する
- 3. 問題なければ、奥にいるServletへ「どうぞ」と渡す
- 4. Servletからのレスポンスが戻ってきたら、ログを記録するなどの後処理を行う
この「受付係」の役割をプログラムで実現するのがHttpFilterクラスだと考えると、イメージしやすくなります。
HttpFilterは、javax.servlet.Filterインターフェースを拡張したクラスで、HTTP専用に使いやすくしたフィルタです。これにより、開発者はHttpServletRequestやHttpServletResponseをそのまま受け取り、URL、ヘッダー、ステータスコードなどの情報を簡単に扱えます。Java Servlet を使ったWebアプリケーションで、共通処理や認証・ログ出力を整理したいときに、まず覚えておきたい基本クラスがこのHttpFilterクラスです。
2. doFilterメソッドとは?
HttpFilterの中で最も重要なのが、doFilterメソッドです。このメソッドは、Servletにリクエストが届く前後に実行される処理を記述する場所です。
doFilterメソッドの中では、主に以下のような処理が行えます:
- リクエスト前の前処理(ログ出力、認証確認など)
- 処理の中断(条件に応じてレスポンス終了)
- Servletや次のフィルタへの処理の引き渡し
- レスポンス後の後処理(ステータス確認、ログ出力など)
3. doFilterメソッドの基本的な書き方
doFilterメソッドは、以下のようにオーバーライドして使います。HTTPリクエストとHTTPレスポンスの情報を使って処理できます。
@WebFilter("/*")
public class ExampleFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("リクエスト開始: " + request.getRequestURI());
chain.doFilter(request, response);
System.out.println("レスポンス完了: ステータス = " + response.getStatus());
}
}
このようにchain.doFilter()の前に前処理を、後に後処理を記述します。
4. WebFilterアノテーションでの登録方法
@WebFilterアノテーションを使えば、web.xmlに設定を追加しなくても、フィルタクラスを自動的に登録できます。
たとえば@WebFilter("/*")と指定すると、すべてのURLに対してこのフィルタが適用されます。
5. doFilterメソッドの注意点
doFilterメソッドの中でchain.doFilter()を呼び忘れると、Servletや他のフィルタに処理が進まず、レスポンスが返ってこない状態になります。
また、処理の途中でエラーが発生した場合や、条件に応じてレスポンスを直接返す場合は、chain.doFilter()を呼ばずに処理を終了することもあります。
6. 実用的な活用例
doFilterメソッドを使うことで、以下のような共通処理をServletに対して追加できます:
- ログインユーザーのチェック
- 管理者専用ページへのアクセス制限
- 文字コード(UTF-8など)の統一
- アクセス数の記録
このように、HttpFilterとdoFilterメソッドは、Servletアプリケーションの品質を高めるために非常に有用な仕組みです。
7. フィルタの適用順序と制御
複数のHttpFilterを使っている場合、それらがどの順番で実行されるかは重要です。Servletでは、フィルタの適用順序をコントロールすることができます。@WebFilterを使った場合、@WebFilterアノテーションのdispatcherTypesやurlPatternsの指定によって範囲を絞ることができ、順序制御が必要な場合はweb.xmlを使って記述順で管理するのが一般的です。
実行順によって処理結果が変わることもあるため、ログ出力や認証チェックのような前提処理は、なるべく早い段階で行われるように設計しましょう。
8. フィルタと例外処理の関係
doFilterメソッドの中で例外が発生した場合、その例外はServletコンテナに伝搬されます。たとえば、認証に失敗してHttpServletResponseにエラーレスポンスを返したり、例外をスローすることで特定のエラーページに遷移させることも可能です。
例外処理を正しく行わないと、空白ページや500エラーとなることもあるため、ログ出力やcatchブロックによる補足処理を入れるなど、安全な実装が求められます。
9. Servletフィルタとセキュリティ対策
HttpFilterは、セキュリティ対策にも活用できます。たとえば、クロスサイトスクリプティング(XSS)対策として入力値をチェックしたり、クロスサイトリクエストフォージェリ(CSRF)トークンの確認処理を行うことができます。
他にも、不正IPからのアクセスブロックや、リクエストヘッダーの検査を行って、特定の条件でリクエストを遮断するといった実装も可能です。アプリケーションのセキュリティを強化するために、フィルタを戦略的に活用するのが効果的です。
まとめ
今回の記事では、Java Servletにおける共通処理の仕組みとして重要なjavax.servlet.http.HttpFilterクラスと、その中核をなすdoFilterメソッドについて解説しました。Webアプリケーションを開発するうえで、すべてのリクエストやレスポンスに対して処理を加えたい場面は多く存在します。そこで活躍するのが、このHttpFilterです。
HttpFilterクラスを継承することで、リクエストがServletに届く「前」と「後」の両方に処理を挿入できるようになります。たとえば、すべてのリクエストに対する共通ログ出力、アクセス制限(ログインチェックや管理者判定など)、文字コードの統一(UTF-8化)など、複数のServletで同じ処理を書く必要がなくなり、保守性や再利用性が飛躍的に向上します。
特にdoFilterメソッド内では、chain.doFilter()を呼ぶことで「次の処理へ進める」ことができます。これを忘れるとServletや次のFilterに処理が渡らず、レスポンスが返ってこないという問題になりますので、実装時には注意が必要です。
さらに、@WebFilterアノテーションを使えば、web.xmlに設定を書く必要もなく、自動的にフィルタを有効にできます。これにより、設定ミスや記述漏れを防ぎ、開発スピードが向上します。
以下は、記事内でも紹介したdoFilterメソッドの実装例です。初心者がHttpFilterを学ぶ際に役立つ基本構文として覚えておきましょう。
@WebFilter("/*")
public class ExampleFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("リクエスト開始: " + request.getRequestURI());
chain.doFilter(request, response);
System.out.println("レスポンス完了: ステータス = " + response.getStatus());
}
}
このように、Java Servlet開発においてHttpFilterとdoFilterは非常に重要で、セキュリティ、可読性、メンテナンス性を高めるために不可欠な要素です。今後のWebアプリケーション開発でも積極的に活用していきましょう。
生徒
「先生、HttpFilterってすごく便利なんですね!ログ出力やログインチェックも簡単にできるってわかりました。」
先生
「その通りです。Servletの処理ごとに同じコードを書くより、HttpFilterにまとめた方が効率的で安全です。」
生徒
「doFilterメソッドの中でchain.doFilter()を忘れないように気をつけます!」
先生
「それがとても大切です。処理が止まってレスポンスが返らなくなる原因になるので注意しましょう。」
生徒
「@WebFilterアノテーションも便利でした。XMLに書かなくても自動で設定されるんですね!」
先生
「はい。最近の開発ではアノテーションベースの設定が主流なので、覚えておくと便利ですよ。」
生徒
「これから共通処理が必要なときは、迷わずHttpFilterを使ってみます!」
先生
「すばらしい姿勢ですね!現場でも非常によく使う技術なので、今のうちにしっかりマスターしておきましょう。」