方法 1
Spring Boot では、インターセプターを使用してグローバル リクエスト インターセプトを実装できます。例:
まず、HandlerInterceptor インターフェースを実装するインターセプター クラスを作成します。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class GlobalInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在请求处理之前进行调用(Controller方法调用之前)
// 返回true才会继续向下执行,返回false取消当前请求
System.out.println("GlobalInterceptor preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
System.out.println("GlobalInterceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作)
System.out.println("GlobalInterceptor afterCompletion");
}
}
次に、インターセプターを構成クラスに登録します。
import org.springframework.beans.factory.annotation.Autowired;
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 WebConfig implements WebMvcConfigurer {
@Autowired
private GlobalInterceptor globalInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器,并设置拦截路径
registry.addInterceptor(globalInterceptor).addPathPatterns("/**");
}
}
上記の例では、GlobalInterceptor クラスは HandlerInterceptor インターフェイスを実装し、preHandle、postHandle、および afterCompletion メソッドをオーバーライドします。preHandle メソッドでは、権限の検証、ログ記録など、いくつかの前処理を実行できます。postHandle メソッドでは、返された結果の変更、追加の応答ヘッダーの追加などの後処理を実行できます。afterCompletion メソッドでは、一部のリソースのクリーンアップ作業を実行できます。
WebConfig 構成クラスで、addInterceptors メソッドを通じて GlobalInterceptor をインターセプターとして登録し、インターセプト パスを に設定して"/**"
、すべての要求がインターセプトされることを示します。
このようにして、リクエストが到着すると、最初に GlobalInterceptor の preHandle メソッドを通過し、次にコントローラーに入ってリクエストを処理し、最後に GlobalInterceptor の postHandle メソッドと afterCompletion メソッドを通過します。
方法 2
RequestBodyAdvice
と は、ResponseBodyAdvice
リクエスト処理中にリクエスト本文と応答本文を処理するために Spring フレームワークによって提供される 2 つのインターフェイスです。
RequestBodyAdvice
リクエストがコントローラーに到達する前にリクエスト本文を処理するために使用されます。リクエスト本文は変更、解析、検証などが可能です。
ResponseBodyAdvice
コントローラー メソッドが結果を返した後に応答本文を処理するために使用されます。応答本文は変更、カプセル化、暗号化などが可能です。
これら 2 つのインターフェイスは、リクエスト本文と応答本文をそれぞれ処理するために同時に使用できます。RequestBodyAdvice
実装およびインターフェースを通じて使用できResponseBodyAdvice
、Spring Bean として登録できます。
たとえば、RequestBodyAdvice
リクエスト本文を処理するインターフェイスを実装するクラスを作成できます。
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import java.io.IOException;
import java.lang.reflect.Type;
@ControllerAdvice
public class GlobalRequestBodyAdvice implements RequestBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
// 判断是否支持对该请求进行处理
return true;
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
// 对请求体进行处理,返回处理后的HttpInputMessage
return inputMessage;
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class<? extends HttpMessageConverter<?>> converterType) {
// 请求体读取完成后的处理,可以对body进行进一步处理
return body;
}
@Override
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
// 处理空请求体的情况
return body;
}
}
同時に、ResponseBodyAdvice
応答本文を処理するインターフェイスを実装するクラスを作成できます。
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
@ControllerAdvice
public class GlobalResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 判断是否支持对该响应进行处理
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
// 对响应体进行处理,返回处理后的响应体
return body;
}
}
上記の例では、リクエスト本文を処理するためにインターフェイスがGlobalRequestBodyAdvice
実装されています。レスポンスボディを処理するためのインターフェースを実装しました。RequestBodyAdvice
GlobalResponseBodyAdvice
ResponseBodyAdvice
アノテーションを使用して@ControllerAdvice
、これら 2 つのクラスをグローバル コントローラー拡張機能として登録し、有効にします。
このようにして、リクエストが受信されると、GlobalRequestBodyAdvice
最初にリクエスト本文が処理され、次にController
リクエストが処理され、最後にGlobalResponseBodyAdvice
応答本文が処理されます。
注: これは、リクエスト パラメータが @RequestBody の場合にのみ実行されます。GlobalRequestBodyAdvice
関係性と相違点
Interceptor、RequestBodyAdvice、ResponseBodyAdvice は同時に使用できます。
それらの関係と違いは次のとおりです。
-
インターセプター:
- インターセプターは、リクエスト処理のさまざまな段階でインターセプトおよび処理するために Spring MVC フレームワークによって提供されるメカニズムです。
- インターセプターは、リクエストの処理前 (preHandle)、リクエストの処理後 (postHandle)、およびリクエストの処理全体が完了した後 (afterCompletion) に、追加のロジックを実行できます。
- インターセプターを使用すると、グローバル リクエストのインターセプト、権限の検証、ロギング、その他の機能を実装できます。
-
リクエスト本文アドバイス:
- RequestBodyAdvice は、リクエスト処理中にリクエストボディを処理するために Spring フレームワークによって提供されるインターフェースです。
- RequestBodyAdvice は、リクエストがコントローラーに到達する前に、リクエスト本文の変更、解析、検証などの操作を行うことができます。
- RequestBodyAdvice を使用すると、リクエストボディの暗号化と復号化、データ形式の変換、データ検証などの機能を実装できます。
-
返答本文アドバイス:
- ResponseBodyAdvice は、Controller メソッドが結果を返した後にレスポンスボディを処理するために Spring フレームワークによって提供されるインターフェイスです。
- ResponseBodyAdvice は、応答本文の変更、カプセル化、暗号化などの操作を行うことができます。
- ResponseBodyAdvice を使用すると、レスポンスボディの暗号化、データ形式の変換、データのカプセル化などの機能を実装できます。
これら 3 つの関数は同時に使用でき、それぞれが異なる処理ロジックを担当します。
- インターセプターは、リクエストをグローバルにインターセプトして処理することができ、グローバルなリクエストのインターセプト、権限の検証、ロギング、その他の機能を実装するために使用できます。
- RequestBodyAdvice は、リクエストがコントローラーに到達する前にリクエスト本文を処理するために使用され、リクエスト本文の変更、解析、検証、その他の操作を行うことができます。
- ResponseBodyAdvice は、Controller メソッドが結果を返した後に応答本文を処理するために使用され、応答本文の変更、カプセル化、暗号化などの操作を行うことができます。
インターセプター、RequestBodyAdvice、および ResponseBodyAdvice を一緒に使用することにより、より柔軟で包括的なリクエストとレスポンスの処理を実現できます。
インターセプターと RequestBodyAdvice にはさまざまな機能と使用シナリオがあり、特定のニーズに応じて使用することを選択できます。
リクエストパラメータの型は @RequestBody で、実行シーケンスは次のとおりです。
GlobalInterceptor preHandle
GlobalRequestBody supports
GlobalRequestBody beforeBodyRead
GlobalRequestBody supports
GlobalRequestBody afterBodyRead
GlobalResponseBody supports
GlobalResponseBody beforeBodyWrite
GlobalInterceptor postHandle
GlobalInterceptor afterCompletion