springboot对请求参数 和 响应参数 进行处理的方法 RequestBodyAdvice 和 ResponseBodyAdvice

在开发中,有时候我们需要在请求之前或之后做一些操作,比如:对参数进行解密,对所有的返回值进行加密等。这些与业务无关的操作,我们没有必要在每个 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;
    }
}

猜你喜欢

转载自blog.csdn.net/Drug_/article/details/127573446