在開發中,有時候我們需要在請求之前或之後做一些操作,比如:對參數進行解密,對所有的傳回值進行加密等。這些與業務無關的操作,我們沒有必要在每個 controller 方法中都寫一遍,
方案一
我們可以利用 過濾器 或者 攔截器 進行操作 HandlerInterceptor 和 Filter
這種方式 擷取到 參數後 進行操作 然後 再發送給控制器
方案二
使用 springmvc 中的@ControllerAdvice 和 RequestBodyAdvice、ResponseBodyAdvice 來對請求前後進行處理,本質上就是 aop 的思想。
RequestBodyAdvice:對@RquestBody 進行增強處理,比如所有請求的資料都加密之後放在 body 中,在到達 controller 的方法之前,需要先進行解密,那麼就可以通過 RequestBodyAdvice 來進行統一的解密處理,無需在 controller 方法中去做這些通用的操作。
ResponseBodyAdvice:通過名稱就可以知道,這玩意是對@ResponseBody 進行增強處理的,可以對 Controller 中@ResponseBody 類型傳回值進行增強處理,也就是說可以攔截@ResponseBody 類型的傳回值,進行再次處理,比如加密、包裝等操作。
/**
* User: Json
* <p>
* Date: 2022/10/28
**/
@Slf4j
@RestControllerAdvice
@Order(999999)
public class GlobalResponseAdvice 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) {
log.info("【出參路徑】 =======>"+request.getURI()+"【出參資料】===>"+ JSON.toJSONString(body));
return body;
}
}
————————————————
@Slf4j
@RestControllerAdvice
@Order(999999)
public class GlobalRequestBodyAdvice implements RequestBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return false;
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
return null;
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return null;
}
@Override
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return null;
}
}
————————————————