Spring MVCインターセプターの概要
Spring MVCのインターセプターは、リクエストがコントローラーに到達する前後に割り込み処理を行うコンポーネントです。フィルターと似た機能を持ちますが、よりコントローラー層に特化した処理を実現します。
主な使用ケース
- 認証チェック:ログインが必要なリソースへのアクセス制御
- 権限検証:ユーザーの権限に基づいたアクセス制御
- リクエストロギング:リクエスト情報の記録と分析
- レスポンス加工:レスポンスヘッダーの追加や内容の変換
フィルターとの違い
フィルターはServlet仕様に基づく汎用的なリクエスト/レスポンス処理機構であり、インターセプターはSpring MVCフレームワーク内でコントローラー処理の前後に特定の処理を実行します。
インターセプターの実装
HandlerInterceptorインターフェースを実装してインターセプターを作成します。以下の3つのメソッドをオーバーライドできます:
package com.example.interceptors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res,
Object handler) throws Exception {
System.out.println("前処理の実行");
return true; // true: 処理継続, false: 処理中断
}
@Override
public void postHandle(HttpServletRequest req, HttpServletResponse res,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("後処理の実行");
}
@Override
public void afterCompletion(HttpServletRequest req, HttpServletResponse res,
Object handler, Exception ex) throws Exception {
System.out.println("完了処理の実行");
}
}
基本設定方法
XMLによる設定
Spring設定ファイルに直接Bean定義を行います:
<mvc:interceptors>
<bean class="com.example.interceptors.CustomInterceptor"/>
</mvc:interceptors>
アノテーションとXMLの併用
コンポーネントスキャンと@Configurationを利用します:
@Component
public class CustomInterceptor implements HandlerInterceptor {
// 実装内容
}
// XML設定
<mvc:interceptors>
<ref bean="customInterceptor"/>
</mvc:interceptors>
詳細設定
特定のパスだけをインターセプトする高度な設定:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/secure/**"/>
<mvc:exclude-mapping path="/public/**"/>
<ref bean="customInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
複数インターセプターの実行順序
すべてのpreHandleがtrueを返す場合
設定ファイルでの定義順にpreHandleが実行され、逆順でpostHandleとafterCompletionが実行されます。
一部のpreHandleがfalseを返す場合
falseを返したインターセプターより前に実行されたインターセプターのafterCompletionのみが逆順で実行され、postHandleは一切実行されません。
実行フローの内部処理
DispatcherServletのdoDispatchメソッド内で以下の順序で処理が行われます:
- applyPreHandle:全インターセプターのpreHandleを順次実行
- コントローラーメソッドの実行
- applyPostHandle:全インターセプターのpostHandleを逆順実行
- ビューのレンダリング
- triggerAfterCompletion:全インターセプターのafterCompletionを逆順実行