Spring MVC 使用 HttpServletResponseWrapper 修改返回结果
HttpServletResponseWrapper 是什么?
ServletResponse 的包装类,相关设计模式 装饰者模式。
运行环境
jdk 1.7
spring boot 整合的web环境
关键代码
Wrapper

package com.basic.m.web.config; 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; public class CustomizeResponseWrapper extends HttpServletResponseWrapper { private ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); private PrintWriter printWriter = new PrintWriter(outputStream); public CustomizeResponseWrapper(HttpServletResponse response) { super(response); } @Override public PrintWriter getWriter() throws IOException { return printWriter; } @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); } }; } public void flush(){ try { printWriter.flush(); printWriter.close(); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } public ByteArrayOutputStream getByteArrayOutputStream(){ return outputStream; } public String getTextContent() { flush(); return outputStream.toString(); } }
Filter

1 package com.basic.m.web.config; 2 3 import com.alibaba.fastjson.JSONObject; 4 import org.slf4j.Logger; 5 import org.slf4j.LoggerFactory; 6 import org.springframework.core.annotation.Order; 7 8 import javax.servlet.*; 9 import javax.servlet.annotation.WebFilter; 10 import javax.servlet.http.HttpServletResponse; 11 import java.io.IOException; 12 13 @Order(2) 14 @WebFilter(urlPatterns = "/*", filterName = "responseFilter") 15 public class ResponseFilter implements Filter { 16 private static final Logger logger = LoggerFactory.getLogger(ResponseFilter.class); 17 18 @Override 19 public void init(FilterConfig filterConfig) throws ServletException { 20 logger.info("enter ResponseFilter init method"); 21 } 22 23 @Override 24 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 25 logger.info("enter ResponseFilter doFilter method"); 26 CustomizeResponseWrapper responseWrapper = new CustomizeResponseWrapper((HttpServletResponse) response); 27 chain.doFilter(request, responseWrapper); 28 29 System.out.println(responseWrapper.getTextContent()); 30 31 /* MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse) response); 32 chain.doFilter(request, responseWrapper);*/ 33 34 System.out.println(responseWrapper.getTextContent()); 35 36 String content = responseWrapper.getTextContent(); 37 JSONObject resultJson = new JSONObject(); 38 resultJson.put("code", "ok"); 39 resultJson.put("msg", "success"); 40 resultJson.put("result", content); 41 42 response.setContentLength(resultJson.toJSONString().length()); 43 response.setContentType("application/json;charset=utf-8"); 44 ((HttpServletResponse) response).setStatus(203); 45 response.getOutputStream().write(resultJson.toJSONString().getBytes()); 46 } 47 48 @Override 49 public void destroy() { 50 51 } 52 }
参考
通过百度和google 零零散散的查询相关代码后自己实现了一个,这里需要特别注意的是网络上搜索出来的大部分结果都是通过重写 getWriter() 方法来写入流。这里我一直搞不明白为什么。因为个人调试时用于都只会进入 getOutputStream() 方法来写入流。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构