一、引子
有时候,我们相对返回数据做进一步处理,而 httpServletResponse 不允许我们读取其内容,所以我们需要对其自定义包装
二、自定义response wrapper
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
private PrintWriter printWriter = new PrintWriter(outputStream);
public ResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) throws IOException {
outputStream.write(b);
}
@Override
public void write(byte[] b) throws IOException {
outputStream.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
outputStream.write(b, off, len);
}
@Override
public void flush() throws IOException {
outputStream.flush();
}
};
}
@Override
public PrintWriter getWriter() throws IOException {
return printWriter;
}
public void flush(){
try {
printWriter.flush();
printWriter.close();
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public byte[] getContent() {
flush();
return outputStream.toByteArray();
}
}
三、使用
可以在过滤器中使用
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
String requestString = map2String(httpServletRequest.getParameterMap());
String schema = httpServletRequest.getMethod();
//自定义wrapper
ResponseWrapper responseWrapper = new ResponseWrapper(httpServletResponse);
long start = System.currentTimeMillis();
//使用新的wrapper
filterChain.doFilter(httpServletRequest, responseWrapper);
long end = System.currentTimeMillis();
LOGGER.info(schema + COLON + httpServletRequest.getRequestURI() + QUESTION_MARK + requestString + "&consumer=" + (end - start));
//读取wrapper中的内容
byte[] bytes = responseWrapper.getContent();
if (!isRequestPicture(httpServletRequest)){
LOGGER.info(new String(bytes));
}
//将数据重新写入返回数据流中
httpServletResponse.getOutputStream().write(bytes);
}
版权声明:本文为havedream_one原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。