springbootでインターセプターを設定する

SpringBootにおけるアクションメソッド前後の処理

SpringBootでアクションメソッド前後の処理を行う場合にはインターセプターを利用する。具体的には、以下の手順で実装が可能である。

  1. HandlerInterceptorを実装したクラスを作成する。このクラスでアクションメソッド前後の処理を実装する。
  2. 作成したクラスをbeanに登録する。
  3. WebMvcConfigurerAdapterのaddInterceptorsメソッドで作成したクラスをインターセプターとして登録する。

具体的な内容

たとえばアクションメソッド前後でログを出力する処理を実装してみる。

インターセプターの作成

LoggingIntercepterクラスを実装し、ログの出力処理を定義する。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * beaglesoft LLC. All rights reserved.
 * ロギングを行うインターセプター
 */
public class LoggingIntercepter implements HandlerInterceptor {

    private static final Logger logger = LoggerFactory.getLogger(LoggingIntercepter.class);


    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                             Object o) throws Exception {

        logger.debug("LoggingIntercepter.preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,
                           ModelAndView modelAndView) throws Exception {
        logger.debug("LoggingIntercepter.postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                Object o, Exception e) throws Exception {
        logger.debug("LoggingIntercepter.afterCompletion");
    }
}

LoggingIntercepterをbeanに登録する

作成したLoggingIntercepterをbeanに登録します。今回はAppConfig.javaに設定を登録することとします。

@EnableTransactionManagement
@Configuration
public class AppConfig{
        ...
        @Bean
    HandlerInterceptor loggingIntercepter(){
        return new LoggingIntercepter();
    }
        ....
}

WebMvcConfigurerAdapterのaddInterceptorsにLoggingIntercepterを登録する

最後にWebMvcConfigurerAdapterクラスのaddInterceptorsをオーバーライドしてLoggingIntercepterをインターセプターとして登録します。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    HandlerInterceptor loggingIntercepter;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loggingIntercepter);
    }
}

実行してログが出力されることを確認する

上記の設定を行ったら実際に実行してログが出力されることを確認します。BreakPointで停止して内容を確認できます。

f:id:beaglesoft:20151118205645p:plain

参考にしたサイト

java - spring boot adding http request interceptors - Stack Overflow

Spring Boot で複数の Filter を定義する - nise_nabeの日記

SpringBootでのインターセプターに関して - クロノスの技術系ブログ