自定义 ResponseWrapper,用于获取 Response Data
public class RewriteRespWrapper extends HttpServletResponseWrapper {
private final ByteArrayOutputStream output;
private ServletOutputStream filterOutput;
public RewriteRespWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
}
@Override
public ServletOutputStream getOutputStream() {
if (filterOutput == null) {
filterOutput = new ServletOutputStream() {
@Override
public void write(int b) {
// response data 写入 output
output.write(b);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
};
}
return filterOutput;
}
public String getResponseData() {
// 从 output 获取 response data
return output.toString();
}
}
自定义 Filter,用于改写 Response Data
@Component
public class RewriteFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse) response;
// 使用 RewriteRespWrapper 包装原始的 HttpServletResponse 对象,用于获取 Response Data
RewriteRespWrapper rewriteRespWrapper = new RewriteRespWrapper(resp);
filterChain.doFilter(request, rewriteRespWrapper);
String oldRespData = rewriteRespWrapper.getResponseData();
System.out.println("原返回值:" + oldRespData);
String newRespData = "new data";
byte[] newRespDataBytes = newRespData.getBytes(StandardCharsets.UTF_8);
// 这里要注意:set的是字符串的字节长度,不是字符串的长度(如果返回内容长度不一致,可能导致请求卡死)
response.setContentLength(newRespDataBytes.length);
try (ServletOutputStream out = response.getOutputStream()) {
out.write(newRespDataBytes);
out.flush();
}
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容