今回の記事はSpringBootのリクエスト共通処理(前処理・後処理)の実装方法をご紹介する記事です。有名なfilter・interceptorなどを使ってログ出力を実際に実装し、解説していきます。SpringBootなどのMVCフレームワーク初学者がつまずきやすい部分ですので、そういったプロジェクト参画の準備中の方などは是非参考にして見てください。
SpringBootの環境構築
SpringBootの環境構築は下記URLの通りに行いましょう。
では実際にリクエスト共通処理(前処理・後処理)に関してご紹介していきます。
SpringBootのリクエスト共通処理(前処理・後処理)
リクエスト共通処理とは?
リクエスト共通処理とはAPIに対してリクエストを投げた際に必ず通る処理のことです。よく利用される例としては下記のような流れの場合利用されます。
- クライアントPCにてログイン
- ログインのアクセスがあったことをサーバログに書き出し
- APIで認証処理
- 認証の成功可否に関して操作ログに書き出し
- 認証可否をクライアントPCに返却
こういったAPIにアクセスする前後で必ず行いたい処理をリクエスト共通処理と言います。
共通処理の実装方針
共通処理は下記のような関係で実装されます。

「Filter」「Handler Interceptor」に関してご紹介します。
SpringBootプロジェクト作成
プロジェクトは簡単なURLがきた場合にHelloWorldページを表示するものを実装します。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping(value = "/")
public String index(Model model) {
model.addAttribute("message", "Hello World!!");
return "samplePage1";
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello World</title>
<meta charset="utf-8" />
</head>
<body>
<h1>Hello Spring</h1>
<p>
<span th:text="${message}"></span>
</p>
</body>
</html>
ではではまずは「Filter」を実装します。
リクエスト共通処理 〜 Filter 〜
Filter実装は簡単です。下記ファイルを追加するのみです。
src/java配下に新規クラスを作成し、下記を記述します。
package com.example.demo;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.stereotype.Component;
@Component
public class CommonFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init!!");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("フィルターによるリクエスト前処理");
chain.doFilter(request, response);
System.out.println("フィルターによるリクエスト後処理");
}
@Override
public void destroy() {
System.out.println("destroy!!");
}
}
上記でアプリを起動し直すとログに結果が出力されるようになります。
リクエスト共通処理 〜 Handler Interceptor 〜
まずはInterceptorの実装ファイルを作成します。
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 CommonInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("Interceptorによる前処理");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("Interceptorによる中間処理");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("Interceptorによる後処理");
}
}
次に上記Interceptorをプロジェクトに登録するための設定ファイルを作成します。
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 CommonInterceptor testInterceptor() {
return new CommonInterceptor();
}
public void addInterceptors(InterceptorRegistry registry) {
registry
.addInterceptor(testInterceptor())
.addPathPatterns("/hello");
}
}
これで、「/hello」URLにアクセスがあった場合にInterceptorの前中後処理を実装できます。
Controllerに「/hello」に対応する処理を入れておきます。
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping(value = "/")
public String index(Model model) {
model.addAttribute("message", "Hello World!!");
return "samplePage1";
}
@GetMapping(value = "/hello")
public String showHello(Model model) {
model.addAttribute("message", "Helloページ");
return "samplePage1";
}
}
先ほどのFilterと合わせて下記のような順序でログに出力されるようになります。
フィルターによるリクエスト前処理
フィルターによるリクエスト後処理
フィルターによるリクエスト前処理
Interceptorによる前処理
Interceptorによる中間処理
Interceptorによる後処理
フィルターによるリクエスト後処理
では今回の記事は以上です。他にも多数の記事を記載しているので是非参考にしてサイト内みていってください。
コメント