【spring】リクエストの共通処理を実装する方法(HandlerInterceptor編)

spring

springにも、全てのリクエストに共通で動作するFilterクラスのようなものがあります。
(イメージとしては、コントローラクラスの前に処理をするクラスです。)

例えば、以前紹介しました、【log4j】ログの先頭へユニークなIDを付ける方法(NDC編)は、各クラスで個々に対応するのではなく、今回紹介する方法で共通で処理さた方が楽です。

もちろん設定次第では、全てのリクエストではなく、特定のリクエストのみで動作させることも可能な便利な技です。

[スポンサーリンク]

この章でやること

HandlerInterceptorを使って、コントローラ実行前に共通の処理を入れます。

コントローラ実行前の共通クラスを作成します。

まずは、HandlerInterceptorをimplementsしたクラスを作成して下さい。
コントローラ実行前の処理は、preHandleメソッドに書いていきます。

public class RequestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // ここに共通の処理を書きます。
        long uid = System.currentTimeMillis();
        NDC.push(String.valueOf(uid));

        // 戻り値は必ずtrueに変更して下さい。falseだとコントローラクラスが動きません。
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 空実装
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 空実装
    }
}

springの設定ファイルへ、共通クラスを定義します。

springの設定ファイルservlet-context.xmlへ先ほど作成したクラスを定義します。
6行目は、どのリクエストに対して有効となるかの設定です。
コチラのサンプルでは、全てのリクエストに対して有効となる設定となっています。

<beans>
・
・
  <mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/*"/>
        <bean class="jp.co.sample.common.handler.RequestInterceptor" />
    </mvc:interceptor>
  </mvc:interceptors>
・
・
</beans>

解説

HandlerInterceptorをimplementsしたクラスと、springの設定ファイルservlet-context.xmlへの追加の2つの対応で、各コントローラクラスの実行前に動作する共通クラスの作成が完了しました。

サンプルの設定であれば、どんなリクエストがきたとしても、必ず共通の処理を通ることとなります。

springMVCのバージョン

org.springframework-versionは、3.1.0を使っています。
javaは、1.7を使っています。

最後に

全てのリクエストに対する共通処理は、どんなシステムでも必ず入っている処理です。
springを使っているシステムも、もちろん例外ではありません。
今回紹介しました方法、覚えておいて損はないと思います。
それでは!