在开发中,有时候我们需要在请求之前或之后做一些操作,比如:对参数进行解密,对所有的返回值进行加密等。这些与业务无关的操作,我们没有必要在每个 controller 方法中都写一遍,
方案一
我们可以利用 过滤器 或者 拦截器 进行操作 HandlerInterceptor 和 Filter
这种方式 获取到 参数后 进行操作 然后 再发送给控制器
方案二
使用 springmvc 中的@ControllerAdvice 和 RequestBodyAdvice、ResponseBodyAdvice 来对请求前后进行处理,本质上就是 aop 的思想。
RequestBodyAdvice:对@RquestBody 进行增强处理,比如所有请求的数据都加密之后放在 body 中,在到达 controller 的方法之前,需要先进行解密,那么就可以通过 RequestBodyAdvice 来进行统一的解密处理,无需在 controller 方法中去做这些通用的操作。
ResponseBodyAdvice:通过名称就可以知道,这玩意是对@ResponseBody 进行增强处理的,可以对 Controller 中@ResponseBody 类型返回值进行增强处理,也就是说可以拦截@ResponseBody 类型的返回值,进行再次处理,比如加密、包装等操作。
package com.erp.init.config.filter;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* 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;
}
}