转: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. sqlmap的安装

    来自:http://www.51testing.com/html/89/n-3711589.html 一.下载 首先,需下载SqlMap以及适用于Windows系统的Python.下载地址如下: 1. ...

  2. git编译安装

    因yum安装的git版本过低,所以尝试使用编译安装git 以下为编译安装时执行的命令 tar xf git-2.9.5.tar.gz cd git-2.9.5yum install curl-deve ...

  3. 实现自己的MVC AJAX框架计划

    最近看了一下设计自己框架的文章,所以也想自己去实现一个小框架,用于以后的项目中,只求方便, 需要参考各位前辈的代码,或者直接copy过来为我所用,哈哈,想想都开心. 不过,要写个好的框架肯定不容易,现 ...

  4. 雨燕apply项目总结

    1,数据库默认值的问题 数据库尽量是非空的,然后不设置默认值,默认值由程序来设计 因为如果程序中设计有错误,应该是空值的地方没有没有处理掉,那插入数据库的时候应该报错,但如果你设置了默认值,排查将会变 ...

  5. 写好的Java代码在命令窗口运行——总结

    步骤: 1.快捷键 win+r,在窗口中输入cmd,enter键进入DOS窗口. 2.假设写好的代码的目录为:D:\ACM 在DOS中依次写入:cd d: cd ACM 利用cd切换到代码文件所在的目 ...

  6. Android使用okhttp 响应Post请求 使用线程

    1.在libs中导入okhttp-2.7.5.jar和okio-1.11.0.jar. 2.post请求 public void getData(){ new Thread(new Runnable( ...

  7. linux 线程同步

    参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2 一,互斥锁 #include &l ...

  8. 弹框时(如大于body的高度),锁死body,使其不能滚动

    if(flag){ document.body.style.height = '100vh' document.body.style['overflow-y'] = 'hidden' }else{ d ...

  9. centos7安装mysql,以及设置root密码

    1.首先进入mysql官网的下载-社区https://dev.mysql.com/downloads/ 2.点击下载后,切换版本5.7(这里的版本对于rpm没有作用),然后在新的页面中选择操作系统 3 ...

  10. LeetCode 简单等级

    1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...