背景:在SPRING 框架之中, 有一个服务端需要提供多种形态的服务,这里的多种形态只是返回值得展示形式(其实 数据内在逻辑完全一样), 比如:

形式1:   JSONP({“key1”: value1, "key2":value2, "key3":value3, ....})

形式2:  {“key1”: value1, "key2":value2, "key3":value3, ....}

为了使得后台业务处理代码一样(不做任何区分),现在理由过滤器,对返回接口进行处理,根据需要加上 :JSONP(...)

主要实现步骤如下:

1.  在web.xml 中配置过滤器

<filter>
<filter-name>RewriteResponse</filter-name>
<filter-class>com.robin.filter.RewriteResponse</filter-class>
</filter>
 
<filter-mapping>
<filter-name>RewriteResponse</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
 //  斜杠星代表匹配任何请求

2.   重点在于RewriteResponse  过滤器

public class RewriteResponseFilter extends Filter {

public String description() {
// TODO Auto-generated method stub
return null;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException {
// TODO Auto-generated method stub

ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response);

try {
chain.doFilter(request, responseWrapper);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

String responseContent = new String(responseWrapper.getDataStream());

RestResponse fullResponse = new RestResponse(205, "OK-MESSAGE",responseContent);

byte[] responseToSend = restResponseBytes(fullResponse);

response.getOutputStream().write(responseToSend);

}

  private byte[] restResponseBytes(RestResponse response) throws IOException {
    String serialized = new ObjectMapper().writeValueAsString(response);
    return serialized.getBytes("UTF-8");
  }

}

3.    通用业务类(用于返回)

public class RestResponse implements Serializable  {
private int status;

private String message;

private Object data;

public RestResponse(int status, String message, Object data) {
this.status = status;
this.message = message;
this.data = data;
}

public int getStatus() {
return status;
}

public void setStatus(int status) {
this.status = status;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

}

4.  实现ServletOutputStream  指定的扩展

public class FilterServletOutputStream extends ServletOutputStream {

DataOutputStream output;
public FilterServletOutputStream(OutputStream output) {
this.output = new DataOutputStream(output);
} @Override
public void write(int arg0) throws IOException {
output.write(arg0);
} @Override
public void write(byte[] arg0, int arg1, int arg2) throws IOException {
output.write(arg0, arg1, arg2);
} @Override
public void write(byte[] arg0) throws IOException {
output.write(arg0);
}
}

5.  替换原来的输出

public class ResponseWrapper extends HttpServletResponseWrapper {

ByteArrayOutputStream output;
FilterServletOutputStream filterOutput;
HttpResponseStatus status = HttpResponseStatus.OK; public ResponseWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
} @Override
public ServletOutputStream getOutputStream() throws IOException {
if (filterOutput == null) {
filterOutput = new FilterServletOutputStream(output);
}
return filterOutput;
} public byte[] getDataStream() {
return output.toByteArray();
}
}

文章应用:  http://stackoverflow.com/questions/25020331/spring-mvc-how-to-modify-json-response-sent-from-controller

如何获取HttpServletResponse里面的内容的更多相关文章

  1. Shell 获取指定行的内容

    需求: 有一个文件,根据指定的字符串,得到该字符串上两行的内容. 文件内容如下: linux-56:# cat sys.ttconnect.ini # Copyright (C) 1999, 2006 ...

  2. jquery获取文本框的内容

    使用jquery获取文本框的内容有以下几种: 1.根据ID取值(id属性): // javascript <script type="text/javascript"> ...

  3. Android 获取系统短信内容

    //这里通过内容提供者获取系统短信内容 Uri uri = Uri.parse("content://sms/"); String[] projection = {"_i ...

  4. WPF Paragraph获取或修改文本内容

    一.说明 Paragraph继承自Block,Block继承自TextElement,在TextElement中 // // 摘要: // 获取表示元素中内容末尾的 System.Windows.Do ...

  5. 服务端获取客户端html页面内容-2013-6-28-2

    客户端怎么提交  整个html页面?    分析:      1>我们知道b/s模式,也知道http协议.服务端想要获取客户端的数据,客户端就 必须提交给它,服务器才能获取到.     2> ...

  6. 用TcpClient如何获取远程网页的内容

    用TcpClient如何获取远程网页的内容 private string GetHTMLTCP(string URL) { string strHTML = "";//用来保存获得 ...

  7. HttpResponseMessage获取请求响应体内容

    问题描述 使用httpClient获取的HttpResponseMessage类型的response,直接对其toString()获取的是请求的响应头,并没有获取响应体的内容 解决办法 HttpRes ...

  8. .NetCore获取json文件配置内容

    .netcore中的数据配置及内容用了json文件代替了之前framework的xml文件,那么json中的数据该怎么获取呢?下面讲解json文件在.net core中的获取方法. 首先,新建一个.n ...

  9. 为什么不能用 JS 获取剪贴板上的内容?

    为什么不能用 JS 获取剪贴板上的内容? 为什么不能用 JS 获取剪贴板上的内容? 发一串口令给朋友朋友复制这串口令,然后访问你的网站你在网站上用 JS 读取朋友剪贴板上的口令根据不同的口令,显示不同 ...

随机推荐

  1. [转]c#.NET和VB.NET语法的比较

    本文转自:http://www.cnblogs.com/lify0407/archive/2007/08/01/838589.html c#.NET和VB.NET语法的比较   VB.NET C# C ...

  2. Matlab使用难点记忆

    MATLAB的数据显示格式 虽然在MATLAB系统中数据的存储和计算都是双精度进行的,但MATLAB可以利用菜单或format命令来调整数据的显示格式.Format命令的格式和作用如下: l  for ...

  3. I2C总线协议的总结介绍

    在看天翔哥的视频之后,他强调要把I2C协议好好研究一下,那么就对一些基本的通信手段是十分有帮助的..那么就来了解一下I2C总线协议的一些知识吧. I2C(Inter-Integrated Circui ...

  4. 接口和抽象类:Interface、abstract _【转】

    一.接口 接口是C#中很常见的工具,概念什么的就不说了,这里讲几个值得注意的小地方: 1.接口内部只能有函数.属性和事件的声明: interface IParent { void Show(); st ...

  5. 【JDK源码系列】ConcurrentHashMap

    并发永远是高性能的话题,而并发容器又是java中重要的并发工具,所以今天我们来分析一下Concurrent包中ConcurrentHashMap(以下简称Chashmap).普通容器在某些并发情况下的 ...

  6. .Net Core 学习 (1) - ASP.NET Core 总览

    什么是ASP.NET 1.0 开源 - GitHub 跨平台 - 支持Windows, Mac, Linux 从底层进行了优化 - 使用最小开销的模块化组件 - 给与了开发人员很大的灵活性 为什么要使 ...

  7. 【HTML XHTML CSS基础教程(第6版)】笔记之CSS笔记(7~25章)

      第7章 CSS构造块   1.在样式表中添加注释 /*内容*/   2.CSS颜色 rgb(红,黄,蓝) 这三个参数可以用百分号:rgb(35%,0%,50%); 也可以用数字,如上代码就相当于r ...

  8. Java编写的文本编辑器(菜鸟作品)

    //这是主窗体文件 Wordwin.java import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.sw ...

  9. and or判别

    and 和 or涉及到短路运算,python把0,'',none看做false,其余是true, 对于a and b,若a是true则,返回b,若a是false则返回a(因为a是true还需要判断b, ...

  10. java学习笔记3

    今天在练习java中的javabean的使用中发现.usebean的 <jsp:setProperty property="id" name="user" ...