Spring MVCにおけるインターセプターの実装と設定

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メソッド内で以下の順序で処理が行われます:

  1. applyPreHandle:全インターセプターのpreHandleを順次実行
  2. コントローラーメソッドの実行
  3. applyPostHandle:全インターセプターのpostHandleを逆順実行
  4. ビューのレンダリング
  5. triggerAfterCompletion:全インターセプターのafterCompletionを逆順実行

タグ: Spring MVC HandlerInterceptor Java Webアプリケーション 設定XML

5月15日 14:35 投稿