SpringBoot メソッドの前後で処理する(インターセプター)

SpringBootのコントローラのメソッドの前後で処理するサンプルです。
インターセプターを使用します(HandlerInterceptor)。
(確認環境:Spring Boot 2.5,JDK 11)

目次

サンプル インターセプターでコントローラのメソッドの前後に実行する
  コントローラ(MainController.java)
  設定ファイル(WebMvcConfig.java)
  インターセプター(TestInterceptor.java)
  設定ファイル(application.properties)
実行結果

インターセプターでコントローラのメソッド前後に実行する

MainController.javaにアクセスし@RestControllerでJSONを返します。

その際、HandlerInterceptorを実装したインターセプター(TestInterceptor.java)を使用して以下のタイミングで文字列を出力します。
・コントローラのメソッドの前(preHandle)
・コントローラのメソッドの後(postHandle)
・リクエスト処理の完了後(afterCompletion)

http://localhost:8765/test1でアクセスします。

githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-HandlerInterceptor

 

コントローラ(MainController.java)

package com.example.demo;

import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MainController {
	@GetMapping("/test1")
	public Map<String,String> output1() {
		Map<String,String> map1 = new HashMap<>();
		map1.put("a", "赤");
		map1.put("b", "黄");
		map1.put("c", "青");
		System.out.println("return前");
		return map1;
	}
}

8行目は、@RestControllerです。JSONを返します。
16行目は、文字列を表示します。

 

設定ファイル(WebMvcConfig.java)

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	@Bean
	public TestInterceptor testInterceptor() {
		return new TestInterceptor();
	}

	public void addInterceptors(InterceptorRegistry registry) {
		registry
			.addInterceptor(testInterceptor())
			.addPathPatterns("/test1");
			//.addPathPatterns("/test2");
	}
}

17行目は、インターセプターを追加します。複数の指定も可能です。
18行目の/test1が対象になります。
19行目のように対象を増やすことも可能です。

 

インターセプター(TestInterceptor.java)

package com.example.demo;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                    HttpServletResponse response,
                    Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }
	@Override
	public void postHandle(HttpServletRequest request, 
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle");
	}
	@Override
	public void afterCompletion(HttpServletRequest request, 
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion");
	}
}

10行目のpreHandleは、メソッドの実行前に実行されます。
17行目のpostHandleは、メソッドの実行後に実行されます。
10行目のafterCompletionは、リクエスト処理の完了後に実行されます。

設定ファイル(application.properties)

server.port = 8765

ポート番号を変更しています。

実行結果

実行結果は、コンソールに以下の順番で表示されます。

https://spring.pleiades.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html

関連の記事

SpringBoot フォームで入力チェック(バリデーション)

△上に戻る