/**
* 这个就是一个标识是否加解密的注解
*/
@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;
}
}