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
ポート番号を変更しています。
実行結果
実行結果は、コンソールに以下の順番で表示されます。
関連の記事