天天看點

springboot對請求參數和響應參數進行處理的方法

作者:Json說

在開發中,有時候我們需要在請求之前或之後做一些操作,比如:對參數進行解密,對所有的傳回值進行加密等。這些與業務無關的操作,我們沒有必要在每個 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;

}

}

————————————————

繼續閱讀