如何将HttpServletResponse的Body提取为字符串?
提取HttpServletResponse的Body为字符串(无需过滤器)
由于你的场景是将HttpServletResponse作为数据容器而非实际发送HTTP响应,无法使用过滤器捕获内容,最直接的方案是通过自定义HttpServletResponseWrapper替换输出流,缓存所有写入的内容,最终转换为字符串。
实现步骤
- 编写响应包装类,将输出流替换为ByteArrayOutputStream以缓存内容
import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; public class CapturingResponseWrapper extends HttpServletResponseWrapper { private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); private PrintWriter writer; public CapturingResponseWrapper(HttpServletResponse response) { super(response); } @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public boolean isReady() { return true; } @Override public void setWriteListener(WriteListener writeListener) {} @Override public void write(int b) throws IOException { byteArrayOutputStream.write(b); } }; } @Override public PrintWriter getWriter() throws IOException { if (writer == null) { writer = new PrintWriter(new StringWriter() { @Override public void write(String str, int off, int len) { try { byteArrayOutputStream.write(str.getBytes(getCharacterEncoding()), off, len); } catch (IOException e) { throw new RuntimeException(e); } } }); } return writer; } public String getCapturedBody() { if (writer != null) { writer.flush(); } try { return byteArrayOutputStream.toString(getCharacterEncoding()); } catch (IOException e) { throw new RuntimeException(e); } } }
- 在业务代码中使用包装类捕获Body
// 包装原始HttpServletResponse CapturingResponseWrapper responseWrapper = new CapturingResponseWrapper(originalResponse); // 执行原本写入响应的逻辑(比如业务代码中调用response.getWriter()/getOutputStream()写入内容) responseWrapper.getWriter().write("示例响应内容"); responseWrapper.getWriter().flush(); // 提取Body字符串 String responseBody = responseWrapper.getCapturedBody();
注意事项
- 务必调用
flush()确保所有写入内容被缓存到ByteArrayOutputStream中 - 使用
getCharacterEncoding()保证字符串编码与原响应一致,避免乱码 - 该方案无需依赖过滤器,直接在代码中包装响应对象,完全适配你将Response作为数据容器的改造场景
内容的提问来源于stack exchange,提问作者Cube.
相关产品推荐
相关产品推荐

