自定义注解配合使用ResponseBodyAdvice对返回数据进行二次封装

本文介绍了一种通过定义自定义注解`CheckEncrypt`来标记需要加密的方法,并利用`ResponseBodyAdvice`进行二次加密的实现方式。当方法上添加了`CheckEncrypt`注解后,其返回值将在响应前经过加密处理,确保数据的安全性。
1、定义自定义注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckEncrypt {
}
2、在方法上加入该注解后,认定为该方法的返回值需要进行加密
3、使用ResponseBodyAdvice进行二次加密
@Slf4j
@RestControllerAdvice
public class EncryptResponseBodyAdvice implements ResponseBodyAdvice {
    private final static Logger logger = LoggerFactory.getLogger(EncryptResponseBodyAdvice.class);

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        RequestMappingHandlerMapping mappings = SpringContextHolder.getBean("requestMappingHandlerMapping");
        HandlerExecutionChain handler = null;
        try {
            handler = mappings.getHandler(request);
        } catch (Exception e) {
            log.error("通过request获取handler异常", e);
        }
        if(handler != null){
            HandlerMethod handlerMethod = (HandlerMethod) handler.getHandler();
            CheckEncrypt checkEncrypt = handlerMethod.getMethodAnnotation(CheckEncrypt.class);
            // 没加该注解,则不校验DES加密
            return checkEncrypt != null;
        }
        return false;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest request, ServerHttpResponse serverHttpResponse) {
        logger.info("对接口 :{} ,返回数据:{},进行加密",request.getURI().getPath(),JSON.toJSONString(body));
        try {
            return DESUtil.encrypt(DESUtil.DES_KEY, JSON.toJSONString(body));
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return body;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值