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
 package com.basic.m.web.config;

 import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @Order(2)
@WebFilter(urlPatterns = "/*", filterName = "responseFilter")
public class ResponseFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(ResponseFilter.class); @Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("enter ResponseFilter init method");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
logger.info("enter ResponseFilter doFilter method");
CustomizeResponseWrapper responseWrapper = new CustomizeResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, responseWrapper); System.out.println(responseWrapper.getTextContent()); /* MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, responseWrapper);*/ System.out.println(responseWrapper.getTextContent()); String content = responseWrapper.getTextContent();
JSONObject resultJson = new JSONObject();
resultJson.put("code", "ok");
resultJson.put("msg", "success");
resultJson.put("result", content); response.setContentLength(resultJson.toJSONString().length());
response.setContentType("application/json;charset=utf-8");
((HttpServletResponse) response).setStatus(203);
response.getOutputStream().write(resultJson.toJSONString().getBytes());
} @Override
public void destroy() { }
}

参考

  通过百度和google 零零散散的查询相关代码后自己实现了一个,这里需要特别注意的是网络上搜索出来的大部分结果都是通过重写 getWriter() 方法来写入流。这里我一直搞不明白为什么。因为个人调试时用于都只会进入 getOutputStream() 方法来写入流。

 

Spring MVC 使用 HttpServletResponseWrapper 修改返回结果的更多相关文章

  1. spring mvc @ResponseStatus 注解 注释返回中文乱码的问题

    前言 前文中讲到,使用@ResponseStatus注解,可以修饰一个异常类,在发生异常的时候返回指定的错误码和消息,在返回的 reason中包含中文的时候,就会出现中文乱码的问题 现象 reason ...

  2. Spring mvc Json 的正确返回姿势

    我们经常都需要封装统一JSON格式 例如以下形式 { “data”:“输出的数据”, “code”:“响应代码”, “msg”:“响应信息” } /** * Created by linli on 2 ...

  3. 160506、Spring mvc新手入门(11)-返回json 字符串的其他方式

    Spring MVC返回 json字符串的方式有很多种方法,这里介绍最简单,也是最常使用的两种方式 一.使用  PrintWriter printWriter  直接输出字符串到返回结果中    不需 ...

  4. Spring MVC全局异常后返回JSON异常数据

    问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...

  5. Spring MVC控制层的返回类型--String类型与Bean类型

    SpringMVC控制层的返回类型形式多样,现拿其中的两种--String类型与Bean类型作以说明. 一.测试项目的结构 说明:(jsp的名字没起好) 控制层:UserController.java ...

  6. Spring MVC中 controller方法返回值

    1.返回ModelAndView 定义ModelAndView对象并返回,对象中可添加model数据.指定view 2.返回String 1.表示返回逻辑视图名 model对象通过 model.add ...

  7. Spring MVC controller的方法返回值

    ModeAndView 可以在构造时确定需要跳转的页面也可以通过setViewName方法来确定需要跳转的页面 String 指定返回页面的视图名称,页面跳转,如果加了@ResponseBody注解, ...

  8. spring mvc 利用匿名内部类构建返回json对象

    @RequestMapping(value = "/order/findOrderByIdVague/{noId}.json", method = {RequestMethod.G ...

  9. Spring MVC 同一个方法同时返回view或json

    https://blog.csdn.net/zzg1229059735/article/details/50854778 @RequestMapping(value = "/htmlorjs ...

随机推荐

  1. mockjs模拟数据请求

    一般项目的方法 <html> <head> <script> <script src="http://requirejs.org/docs/rele ...

  2. 添加SAP_ALL权限

    更新usr04,ust04,usrbf2这三张表 REPORT ZTESTCREATEUSER. data: l_USR04 LIKE USR04 , l_UST04 LIKE UST04 , l_P ...

  3. php 04

    前加加(++$a) 先运算后赋值 后加加($a++) 先赋值后运算 -- 前减减(--$a) 先运算后赋值 后减减($a--) 先赋值后运算 连接运算符(字符串运算符) . 神奇的米粒 1. 字符串和 ...

  4. nc扫描端口

    nc -n -v -z -w 1 ip地址 1-1000 (端口号) 详细信息 -v 排除dns  -n 不发送任何数据-z 超时设置为1秒 -w 1

  5. 服网LNMP集群-1.0.5

    平台: arm 类型: ARM 模板 软件包: haproxy linux mysql nginx application server arm basic software fuwang infra ...

  6. cms-帖子内容实现2

    package com.open1111.controller.admin; import java.io.File;import java.util.Date;import java.util.Ha ...

  7. 百度地图API 基础入门

    一.注册账号,获取密钥 流程-注册-登录-控制台-创建应用-获取密钥: 1.你想要调取百度地图,首先,你需要注册一个百度账号,获取密匙. 2.密钥获取以后,引入到你需要调用百度地图的界面中. 二.创建 ...

  8. js 生成随机数解决缓存的问题

    对于缓存有一个解决方法是在链接后添加随机数 例如登陆后跳转到链接/home,但是有缓存上次用户的登陆名,于是在/home后面加上一个随机数 var href = '/home?'+Math.rando ...

  9. UVA Live Archive 4015 Cave (树形dp,分组背包)

    和Heroes Of Might And Magic 相似,题目的询问是dp的一个副产物. 距离是不好表示成状态的,但是可以换一个角度想,如果知道了从一个点向子树走k个结点的最短距离, 那么就可以回答 ...

  10. 2018.6.22 Java试题测试结果

    如何从有数字规律的网址抓取网页并保存在当前目录?假设网址为 http://test/0.xml,其中这个数字可以递增到100. for((i=0;i<100;++i));do wget http ...