@Component
public class RequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
if (...) {
chain.doFilter(req, response);
return;
}
ResponseWrapper resp = new ResponseWrapper((HttpServletResponse) response);
chain.doFilter(new RequestWrapper(req, getData(req)), resp);
response.setContentLength(-1);
String result = resp.outputStream.toString("utf-8");
response.getWriter().write("..." + result);
}
@Override
public void destroy() {
}
static class RequestWrapper extends HttpServletRequestWrapper {
final byte[] body;
public RequestWrapper(HttpServletRequest request, byte[] body) {
super(request);
this.body = body;
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream s = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return s.read();
}
@Override
public boolean isReady() {
return false;
}
@Override
public boolean isFinished() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
};
}
}
static class ResponseWrapper extends HttpServletResponseWrapper {
final ByteArrayOutputStream outputStream;
public ResponseWrapper(HttpServletResponse response) {
super(response);
outputStream = new ByteArrayOutputStream();
}
@Override
public PrintWriter getWriter() {
return new PrintWriter(outputStream);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
}
@Override
public void write(int b) throws IOException {
outputStream.write(b);
}
};
}
}
}
@Configuration
@ControllerAdvice(assignableTypes = {AbcController.class})
public class AbcRequestBodyAdvice extends RequestBodyAdviceAdapter {
@Override
public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public HttpInputMessage beforeBodyRead(final HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
String data = getData(inputMessage);
return new HttpInputMessage() {
public HttpHeaders getHeaders() {
return inputMessage.getHeaders();
}
public InputStream getBody() throws IOException {
return new ByteArrayInputStream(data.getBytes("UTF-8"));
}
};
}
}
@Configuration
@ControllerAdvice(assignableTypes = {AbcController.class})
public class AbcResponseBodyAdvice implements ResponseBodyAdvice {
@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) {
return getResult(body);
}
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e) {
return getResult(e);
}
}