今回はSpring Frameworkの重要な概念であるFilter、Interceptor、DispatcherServletについて、アウトプットしていきたいと思います。
1. Filter vs Interceptor:根本的な違い
Filterとは?
FilterはJava Servlet仕様の標準機能です。つまり、SpringだけでなくすべてのJava Webアプリケーションで使用できます。
特徴
- Servlet仕様の一部
- DispatcherServletに到達する前後で実行
- ServletRequestとServletResponseにアクセス可能
- Springの機能を使わなくても動作
Interceptorとは?
InterceptorはSpring Framework独自の機能です。Spring MVCでのみ使用できます。
特徴
- Spring Framework固有の機能
- HandlerMappingでコントローラが決定された後に実行
- HandlerやModelAndViewなど、Spring MVC固有の情報にアクセス可能
- より詳細な制御が可能
2. 実行順序を図で理解しよう
HTTPリクエスト
↓
【Filter 前処理】←── Java Servlet仕様
↓
【DispatcherServlet】←── Spring MVCの入り口
↓
【Interceptor 前処理】←── Spring独自機能
↓
【Controller実行】
↓
【Interceptor 後処理】
↓
【Filter 後処理】
↓
HTTPレスポンス
3. 使い分けのポイント
Filterを使うべき場面
| 用途 | 理由 |
|---|---|
| 文字エンコーディング設定 | すべてのリクエストで必要 |
| 基本的な認証チェック | Spring到達前に判定したい場合 |
| CORS設定 | ブラウザレベルでの制御 |
| セキュリティヘッダー追加 | アプリケーション全体で統一 |
| 基本的なログ記録 | 全リクエストを対象にしたい |
Interceptorを使うべき場面
| 用途 | 理由 |
|---|---|
| 詳細な認可チェック | コントローラー情報が必要 |
| パフォーマンス測定 | 具体的なハンドラー単位で測定 |
| モデルデータの共通処理 | ModelAndViewにアクセスが必要 |
| ビュー表示前の処理 | レンダリング前に共通データ設定 |
| コントローラー固有のログ | どのメソッドが実行されたか記録 |
4. DispatcherServlet:Spring MVCの心臓部
DispatcherServletの役割
DispatcherServletはフロントコントローラーパターンを実装したSpring MVCの中核です。
主な処理
- リクエスト受付 – すべてのHTTPリクエストの窓口
- ハンドラー決定 – URLからコントローラーメソッドを特定
- データ変換 – リクエストパラメータをJavaオブジェクトに変換
- ビュー解決 – ビュー名から実際のテンプレートファイルを特定
- レスポンス生成 – モデルとビューを組み合わせて最終的なHTMLを生成
DispatcherServletの詳細な処理フロー
DispatcherServlet内部の処理
1. HandlerMapping
↓ (どのコントローラーを呼ぶ?)
2. HandlerAdapter
↓ (メソッド実行の準備)
3. Interceptor前処理
↓
4. Controller実行
↓
5. Interceptor後処理
↓
6. ViewResolver
↓ (ビューファイルの特定)
7. View Rendering
5. 実際の開発での活用例
よくある組み合わせパターン
パターン1:認証・認可の多層防御
Filter: 基本的なトークン存在チェック
↓
Interceptor: 詳細な権限チェック(管理者のみアクセス可能など)
パターン2:ログ記録の使い分け
Filter: すべてのリクエストの基本ログ(IP、URL、時刻)
↓
Interceptor: コントローラー固有のログ(実行時間、パラメータ詳細)
パターン3:データ処理の段階分け
Filter: 文字エンコーディング、基本的なデータサニタイジング
↓
Interceptor: ビジネスロジック用の共通データ準備
まとめ
- Filter: Java標準機能で、アプリケーション全体の基盤的な処理に使用
- Interceptor: Spring独自機能で、より詳細で柔軟な制御に使用
- DispatcherServlet: Spring MVCの中核で、すべてのリクエストを適切に振り分ける交通整理役
