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. css禁止文字被选中

    有时候,为了让用户有更好的体验,需要禁用掉文本选中功能 比如:使用a标签模拟按钮,如果不禁用掉文本选中功能,那么双击时会选中文字,用起来很不爽. 多数情况下,只需要使用CSS样式就可以实现这个功能啦: ...

  2. linux下mysql多实例安装(转)

    转自:http://www.cnblogs.com/xuchenliang/p/6843990.html   1.MySQL多实例介绍 1.1.什么是MySQL多实例 MySQL多实例就是在一台机器上 ...

  3. cms-幻灯片的实现

    1.其实幻灯片的后台代码和之前的最新动态和推荐是一样的,只是前台遍历的时候不一样罢了 2.代码: 2.1:帖子mapper查询出幻灯片图片: <?xml version="1.0&qu ...

  4. Bezier贝塞尔曲线的原理、二次贝塞尔曲线的实现

    Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状. 一次Bezier曲线公式: 一次Bezier曲线是由P0至P1的连续点, ...

  5. Android(java)学习笔记102:Dalivk虚拟机的初始化过程

    1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:    dvmAllo ...

  6. selective search生成.mat文件

    https://github.com/sergeyk/selective_search_ijcv_with_python 里的selective_search.py是python接口 import t ...

  7. PAT (Basic Level) Practise (中文)- 1004. 成绩排名 (20)

    http://www.patest.cn/contests/pat-b-practise/1004 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入 ...

  8. GPU && CUDA:主机和设备间数据传输测试

    数据传输测试,先从主机传输到设备,再在设备内传输,再从设备传输到主机. H-->D D-->D D-->H // moveArrays.cu // // demonstrates C ...

  9. head与body(新手向)

    网页文档包含了页头(head)与主体(body) 页头 -是对该网页文档进行描绘的主体信息. -至少含有title与meta. meta描述网页的特征,比如字符编码,平时广泛用的utf-8.且meta ...

  10. java基础面试题:请说出作用域public,private,protected,以及不写时的区别

    不写任何作用域(即访问权限)表示friendly public 公共,权限最大,作用域最大,在类内部.同一package.子孙类.其他package都可以访问 protected保护,在类内部.同一p ...