/** * 这个就是一个标识是否加解密的注解 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface CryptFlag { }
@Slf4j @ControllerAdvice public class CryptResponseBodyAdvice implements ResponseBodyAdvice { @Qualifier(value = "initAes") @Autowired private InitAes initAes; @Override public boolean supports(MethodParameter returnType, Class converterType) { return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { Method method = returnType.getMethod(); String url = request.getURI().toASCIIString(); CryptFlag cryptFlag = method.getAnnotation(CryptFlag.class); //有@CryptFlag注解的接口加密,没有就普通返回 ObjectMapper mapper = new ObjectMapper(); String o = null; try { o = mapper.writeValueAsString(body); } catch (JsonProcessingException e) { e.printStackTrace(); } if (null != cryptFlag) { log.info("{}.{},url={},加密数据为:{},原始数据为:{}", method.getDeclaringClass().getSimpleName(), method.getName(), url, encrypt(o.toString(), initAes), o.toString()); return encrypt(o.toString(), initAes); } else { log.info("{}.{},url={},result={}", method.getDeclaringClass().getSimpleName(), method.getName(), url, body); return body; } } }
@Slf4j @ControllerAdvice public class RequestBodyBefore implements RequestBodyAdvice { @Qualifier(value = "initAes") @Autowired private InitAes initAes; @Override public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return true; } @Override public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return body; } @Override public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException { return new HttpInputMessage() { @Override public InputStream getBody() throws IOException { //这个里面进行处理 //判断该接口上是否有注解 Method method = parameter.getMethod(); CryptFlag cryptFlag = method.getAnnotation(CryptFlag.class); String controllerName = parameter.getContainingClass().toString() + parameter.getMethod().getName(); String json = ""; //含有加解密的注解 if (null != cryptFlag) { //获得加密字符串 String enCryptStr = IOUtils.toString(inputMessage.getBody()); log.info("加密字符串为:{}", enCryptStr); json = decrypt(enCryptStr, initAes); log.info("解密过后的json字符串为:{}", json); } else { json = IOUtils.toString(inputMessage.getBody()); log.info("json字符串为:{}", json); } log.info("方法签名为:{}", controllerName); return new ByteArrayInputStream(json.getBytes(inputMessage.getHeaders().getContentType().getCharset())); } @Override public HttpHeaders getHeaders() { return inputMessage.getHeaders(); } }; } @Override public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return body; } }