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);
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;
}
}