背景:在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

最新文章

  1. 隔壁信概大作业xjb写——同化棋ATAXX
  2. web性能优化——代理(nginx)
  3. DataGridView 中添加CheckBox和常用处理方式 .
  4. 设置背景为白色,避免从A视图跳转到B视图的时候出现卡顿
  5. VisualSVN Server仓库迁移到Linux(包含所有版本, 权限,用户信息)
  6. oracle查看锁和释放锁
  7. 13. ZooKeeper最佳实践
  8. Centos7 环境下 tty 终端 中文乱码 问题
  9. springboot中访问jsp文件方式
  10. web故障排查常用命令
  11. js图片预加载与延迟加载
  12. VDSR
  13. rabbitMQ学习2-Python与rabbitmq
  14. 设置DataGridView中表头颜色
  15. Linux 使用 ssh 命令远程连接另一台 Linux
  16. Eclipse复制项目彻底修改项目名称
  17. freeswitch笔记
  18. Xshell无法使用root远程登录Ubuntu16服务器
  19. 2018.06.27Dual Core CPU(最小割)
  20. dos批处理文件中的变量小结

热门文章

  1. 【转载】Hadoop和大数据:60款顶级大数据开源工具
  2. Java中处理Linux信号量
  3. latch和DFF的区别和联系
  4. 移动端web学习总结
  5. sharepoint 删除list里的所有内容
  6. (九)Hibernate 检索策略
  7. Git和CocoaPods的简单使用
  8. 为 Date 对象添加 ago 属性
  9. hdu 1063 Exponentiation (高精度小数乘法)
  10. http数据包解析碰到gzip压缩格式的解压