注意:需要注解@ControllerAdvice和实现RequestBodyAdvice 接口,并且这个拦截只会针对@RqestBody注解的生效 。
@ControllerAdvice(basePackages = "com.ow.xxx.controller")//此处设置需要当前Advice执行的域 , 省略默认全局生效
public class MyEncryptRequestBodyAdvice implements RequestBodyAdvice {
private Logger log = LoggerFactory.getLogger(this.getClass());
private boolean encrypt;//业务参数
@Autowired
private SecretKeyConfig secretKeyConfig;//业务参数
public MyEncryptRequestBodyAdvice() {
}
//第一个执行的方法,该方法判断拦截后是否执行beforeBodyRead()方法;返回false表示不执行
public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
if (methodParameter.getMethod().isAnnotationPresent(MyDecrypt.class) && !this.secretKeyConfig.isDebug()) {
this.encrypt = true;
}
return this.encrypt;
}
//不用关注
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return body;
}
//业务执行方法,自定义类MyDecryptHttpInputMessage必须实现HttpInputMessage接口,在MyDecryptHttpInputMessage修改请求参数
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
if (this.encrypt) {
try {
HttpInputMessage msg = new MyDecryptHttpInputMessage(inputMessage, this.secretKeyConfig.getPrivateKey(), this.secretKeyConfig.getCharset());
return msg;
} catch (Exception var6) {
this.log.error("Decryption failed", var6);
}
}
return inputMessage;
}
//读取参数后执行的代码
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return body;
}
}
自定义类MyDecryptHttpInputMessage实现HttpInputMessage接口
public class MyDecryptHttpInputMessage implements HttpInputMessage {
private Logger log = LoggerFactory.getLogger(this.getClass());
private HttpHeaders headers;//必须要的参数
private InputStream body;//必须要的参数
//下面自定义构造器,实现headers和body的赋值
public MyDecryptHttpInputMessage(HttpInputMessage inputMessage, String privateKey, String charset) throws Exception {
this.headers = inputMessage.getHeaders();
//new BufferedReader(new InputStreamReader(inputMessage.getBody()))).lines() 获取前端传递的参数,这里就是拿到了请求参数
//.collect(Collectors.joining(System.lineSeparator())这里是自己的业务需求
String content = (String)(new BufferedReader(new InputStreamReader(inputMessage.getBody()))).lines().collect(Collectors.joining(System.lineSeparator()));
String decryptBody = content;
//自己的业务处理逻辑。。。。。,处理结果为decryptBody
this.body = new ByteArrayInputStream(decryptBody.getBytes());
}
@Override
public InputStream getBody() throws IOException {
return this.body;
}
@Override
public HttpHeaders getHeaders() {
return this.headers;
}
}