importjava.io.BufferedReader;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.lang.reflect.Type;importorg.springframework.core.MethodParameter;importorg.springframework.http.HttpHeaders;importorg.springframework.http.HttpInputMessage;importorg.springframework.http.converter.HttpMessageConverter;importorg.springframework.stereotype.Component;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;importlombok.extern.slf4j.Slf4j;
@Component
@ControllerAdvice(basePackages= "com.kiki.controller")
@Slf4jpublic class DecodeRequestBodyAdvice implementsRequestBodyAdvice {
@Overridepublic booleansupports(MethodParameter methodParameter, Type targetType,
Class extends HttpMessageConverter>>converterType) {//这里设置成false 它就不会再走这个类了
return true;
}
@OverridepublicHttpInputMessage beforeBodyRead(HttpInputMessage request, MethodParameter parameter, Type targetType,
Class extends HttpMessageConverter>> converterType) throwsIOException {
StringBuilder stringBuilder= newStringBuilder();
BufferedReader bufferedReader= null;try{//这个request其实就是入参 可以从这里获取流//入参放在HttpInputMessage里面 这个方法的返回值也是HttpInputMessage
InputStream inputStream =request.getBody();if (inputStream != null) {
bufferedReader= new BufferedReader(newInputStreamReader(inputStream));char[] charBuffer = new char[128];int bytesRead = -1;while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer,0, bytesRead);
}
}else{
stringBuilder.append("");
}
}catch(IOException ex) {throwex;
}finally{if (bufferedReader != null) {try{
bufferedReader.close();
}catch(IOException ex) {throwex;
}
}
}//获取请求数据
String string =stringBuilder.toString();/*****************进行解密start*******************/log.info("【接受的请求数据】string={}",string);
String decode=Base64Utils.decode(string);
log.info("【解密后的请求数据】decode={}",decode);//把数据放到我们封装的对象中
return new MyHttpInputMessage(request.getHeaders(), new ByteArrayInputStream(decode.getBytes("UTF-8")));
}
@OverridepublicObject afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType,
Class extends HttpMessageConverter>>converterType) {returnbody;
}
@OverridepublicObject handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
Type targetType, Class extends HttpMessageConverter>>converterType) {returnbody;
}//这里实现了HttpInputMessage 封装一个自己的HttpInputMessage
static class MyHttpInputMessage implementsHttpInputMessage {
HttpHeaders headers;
InputStream body;publicMyHttpInputMessage(HttpHeaders headers, InputStream body) {this.headers =headers;this.body =body;
}
@Overridepublic InputStream getBody() throwsIOException {returnbody;
}
@OverridepublicHttpHeaders getHeaders() {returnheaders;
}
}
}