过滤对指定对资源的请求,并在请求中追加响应内容
1. 创建ResponseWrapper
public class ResponseWrapper extends HttpServletResponseWrapper {
private static final Logger LOGGER = LoggerFactory.getLogger(ResponseWrapper.class);
private ByteArrayOutputStream buffer;
private ServletOutputStream out;
public ResponseWrapper(HttpServletResponse response) {
super(response);
buffer = new ByteArrayOutputStream();
out = new WrapperOutputStream(buffer);
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return out;
}
@Override
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
}
@Override
public void reset() {
buffer.reset();
}
public String getResponseData() throws IOException {
flushBuffer();
return new String(buffer.toByteArray());
}
private class WrapperOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos;
public WrapperOutputStream(ByteArrayOutputStream bos) {
this.bos = bos;
}
@Override
public void write(int b) {
bos.write(b);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener listener) {
}
}
}
2.使用创建的responseWrapper进行dofilter()操作,从该对象中获取响应数据并进行操作
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 将HttpServletResponse对象转为定义的ResponseWrapper
ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response);
// 使用自定义对象操作
chain.doFilter(request, responseWrapper);
String result = responseWrapper.getResponseData();
// 按照需求进行操作
String finalResult = ...;
byte[] bytes = finalResult.getBytes();
// 将修改后的返回值会写到HttpServletResponse中
response.setContentLength(bytes.length);
response.getOutputStream().write(finalResult.getBytes());
}