转:java使用Filter过滤器对Response返回值进行修改

练习时只做了对request 的处理,这里记录一下,filter 对 response的处理。

原文地址:java使用Filter过滤器对Response返回值进行修改

有时候在开发过程中会有这样一个场景,有时需要对返回的数据进行处理。比如加密啊,添加某些标记啊等等。这种情况我们可以通过过滤器去处理。

过滤器是什么就不介绍了,百度一下,你就知道。

以下是代码:

返回值输出代理类:这个类主要是为了吧Response里面的返回值获取到,因为直接Response没有提供直接拿到返回值的方法。所以要通过代理来取得返回值

 1 package com.channel.filter;
2
3
4 import java.io.ByteArrayOutputStream;
5 import java.io.IOException;
6
7 import javax.servlet.ServletOutputStream;
8 import javax.servlet.WriteListener;
9 import javax.servlet.http.HttpServletResponse;
10 import javax.servlet.http.HttpServletResponseWrapper;
11
12
13 /**
14 * 返回值输出代理类
15 *
16 * @Title: ResponseWrapper
17 * @Description:
18 * @author kokJuis
19 * @date 上午9:52:11
20 */
21 public class ResponseWrapper extends HttpServletResponseWrapper
22 {
23
24 private ByteArrayOutputStream buffer;
25
26 private ServletOutputStream out;
27
28 public ResponseWrapper(HttpServletResponse httpServletResponse)
29 {
30 super(httpServletResponse);
31 buffer = new ByteArrayOutputStream();
32 out = new WrapperOutputStream(buffer);
33 }
34
35 @Override
36 public ServletOutputStream getOutputStream()
37 throws IOException
38 {
39 return out;
40 }
41
42 @Override
43 public void flushBuffer()
44 throws IOException
45 {
46 if (out != null)
47 {
48 out.flush();
49 }
50 }
51
52 public byte[] getContent()
53 throws IOException
54 {
55 flushBuffer();
56 return buffer.toByteArray();
57 }
58
59 class WrapperOutputStream extends ServletOutputStream
60 {
61 private ByteArrayOutputStream bos;
62
63 public WrapperOutputStream(ByteArrayOutputStream bos)
64 {
65 this.bos = bos;
66 }
67
68 @Override
69 public void write(int b)
70 throws IOException
71 {
72 bos.write(b);
73 }
74
75 @Override
76 public boolean isReady()
77 {
78
79 // TODO Auto-generated method stub
80 return false;
81
82 }
83
84 @Override
85 public void setWriteListener(WriteListener arg0)
86 {
87
88 // TODO Auto-generated method stub
89
90 }
91 }
92
93 }

过滤器类:

 1 package com.channel.filter;
2
3
4 import java.io.IOException;
5
6 import javax.servlet.Filter;
7 import javax.servlet.FilterChain;
8 import javax.servlet.FilterConfig;
9 import javax.servlet.ServletException;
10 import javax.servlet.ServletOutputStream;
11 import javax.servlet.ServletRequest;
12 import javax.servlet.ServletResponse;
13 import javax.servlet.http.HttpServletResponse;
14
15 import com.channel.util.RsaEncryptUtil;
16
17
18 /**
19 * 返回值输出过滤器,这里用来加密返回值
20 *
21 * @Title: ResponseFilter
22 * @Description:
23 * @author kokJuis
24 * @date 上午9:52:42
25 */
26 public class ResponseFilter implements Filter
27 {
28
29 @Override
30 public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
31 throws IOException, ServletException
32 {
33 ResponseWrapper wrapperResponse = new ResponseWrapper((HttpServletResponse)response);//转换成代理类
34 // 这里只拦截返回,直接让请求过去,如果在请求前有处理,可以在这里处理
35 filterChain.doFilter(request, wrapperResponse);
36 byte[] content = wrapperResponse.getContent();//获取返回值
37 //判断是否有值
38 if (content.length > 0)
39 {
40
41 String str = new String(content, "UTF-8");
42 System.out.println("返回值:" + str);
43 String ciphertext = null;
44
45 try
46 {
47 //......根据需要处理返回值
48 }
49 catch (Exception e)
50 {
51 e.printStackTrace();
52 }
53 //把返回值输出到客户端
54 ServletOutputStream out = response.getOutputStream();
55 out.write(ciphertext.getBytes());
56 out.flush();
57 }
58
59 }
60
61 @Override
62 public void init(FilterConfig arg0)
63 throws ServletException
64 {
65
66 }
67
68 @Override
69 public void destroy()
70 {
71
72 }
73
74 }

配置很简单:

spring boot:

 1    /**
2 * 配置过滤器,这里过滤器主要是对返回值做后继处理
3 *
4 * @return
5 */
6 @Bean
7 public FilterRegistrationBean someFilterRegistration()
8 {
9 FilterRegistrationBean registration = new FilterRegistrationBean();
10 registration.setFilter(new ResponseFilter());// 配置一个返回值加密过滤器
11 registration.addUrlPatterns("/*");
12 registration.addInitParameter("paramName", "paramValue");
13 registration.setName("responseFilter");
14 return registration;
15 }

spring mvc 下直接在web.xml下添加配置即可

 1 <!-- 返回值过滤器 -->
2 <filter>
3 <filter-name>responseFilter</filter-name>
4 <filter-class>com.im.filter.ResponseFilter</filter-class>
5 </filter>
6
7 <filter-mapping>
8 <filter-name>responseFilter</filter-name>
9 <url-pattern>/*</url-pattern>
10 </filter-mapping>

java使用Filter过滤器对Response返回值进行修改的更多相关文章

  1. 转:java使用Filter过滤器对Response返回值进行修改

    练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...

  2. Java线程:新特征-有返回值的线程

    http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...

  3. JAVA 多线程 Callable 与 FutureTask:有返回值的多线程

    java多线程中,如果需要有返回值,就需要实现Callable接口. 看例子: 先建立一个Dowork这个类,就是平时某个业务的实现 package com.ming.thread.one; impo ...

  4. 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法

    066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  5. 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法

    065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  6. 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法

    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  7. 063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法

    063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法 本文知识点:无参无返回值方法 无参无返回值方法 案例 为什么使用方法?--方便复杂问题调用 ...

  8. 【Servlet】Java Serlvet Filter 过滤器

    Filter的设计思想Filter是一种AOP(aspect-oriented programming)的设计思想 : 面向切面编程.用于的请求和响应都会走 使用filter的登录案例我们通过一张图片 ...

  9. 拦截器HandlerInterceptorAdapter的postHandle和afterCompletion无法获取response返回值问题

    缘起 有一个需求,在进入controller之前验证调用次数是否超过限制,在响应之后判断是否正常返回,对调用次数进行+1,发现带@RestController的类和带@ResponseBody的方法在 ...

随机推荐

  1. Vue2.5基础

    1.1 创建第一个Vue实例 官方网站:https://cn.vuejs.org 学习 --> 安装 刚开始学习Vue,使用最简单的安装方式,直接用<script>引入 我们下载开发 ...

  2. 超详细SQLMap使用攻略及技巧分享

    sqlmap是一个开源的渗透测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限.它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数 ...

  3. gcc 常用指令

    gcc hello.c    直接编译默认输出 a.out可执行文件 gcc hello.c -o hello    生成名字为hello的可执行文件 gcc hello.c -o hello -Wa ...

  4. layui layui.open弹窗后按enter键不停弹窗问题的解决

    问题描述:layui.open弹窗后,点击enter键会不停弹窗,背景颜色变得越来越深 解决办法:1.使用回调函数让按钮失去焦点 var info = layer.open({ type: 2 , t ...

  5. JS将/Date(1446704778000)/转换成str

    JS将/Date(1446704778000)/转换成str:var dateStr = eval(ele.add_time.replace(/\/Date\((\d+)\)\//gi, " ...

  6. java 类的初始化顺序

    有父类 1. 父类static成员变量 2. 父类static块 3. 父类非static成员 4. 父类非static块 5. 父类构造方法 子类,也按照1-5顺序执行 无父类 1. static成 ...

  7. CentOS7用hostapd做radius服务器为WiFi提供802.1X企业认证

    CentOS7用hostapd做radius服务器为WiFi提供802.1X企业认证 来源: https://www.cnblogs.com/osnosn/p/10593297.html 来自osno ...

  8. HUE安装过程中的一些坑

    1. gcc: error: krb5-config:: No such file or directory 执行安装krb5-devel yum provides krb5-config 得到提示: ...

  9. 20175236 JAVA MyCP(课下作业)

    具体描述: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容 ...

  10. Hbase常见错误解决方法

    Hbase常见错误解决方法 原文转载至:https://www.jianshu.com/p/5fd74812c56c   我是通过maven管理的依赖,直接修改maven依赖中hbase的版本就可以了 ...