转: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. docs actifio

    http://docs.actifio.com/ https://www.actifio.com/resource-center/

  2. Int和String互转的方法

    Java 中int.String的类型转换   int -> String int i=12345;String s="";第一种方法:s=i+"";第二 ...

  3. docker下搭建fastfds

    https://blog.csdn.net/weixin_40247263/article/details/81087726 搭建过程参考 作者 https://me.csdn.net/feng_qi ...

  4. Excel 导入 Mysql

    1.将Excel xls文件 另存为 csv 文件: 2.用记事本打开csv文件,然后另存为编码为utf-8的txt文件: 3.将txt文件后缀更改为csv 4.最后,用phpmyadmin或其他数据 ...

  5. 如何编译luabind支持vs2010之后所有版本

    步骤 下载https://github.com/luabind/luabind/tree/0.9. 其最后一次commit为 Revision: 8c66030818f0eacbb7356c16776 ...

  6. 18.24 Ubuntu修改静态IP

    1.查询系统当前的ip地址配置信息,输入ifconfig命令进行查看 2.打开文件设置静态IP sudo vi /etc/network/interfaces 3.设置address ip.gatew ...

  7. tomcat配置接口访问时间

    这次刚好用到,亲测可用.参照:https://www.cnblogs.com/wuxun1997/p/9068398.html 项目中有些页面时延不稳定,需要看每次接口调用时延,怎么看,有两种方法:一 ...

  8. Oracle触发bug(cursor: mutex S),造成数据库服务器CPU接近100%---SQL子游标多版本问题

    问题现象: 项目反馈系统反应非常缓慢,数据库服务器CPU接近100%! INSERT INTO GSPAudit1712(ID,TypeID,CategoryID,DateTime,UserID,Us ...

  9. Android Studio搭建系统App开发环境

    一.前言 在Android的体系中开发普通app使用Android Studio这一利器会非常的方便.但是开发系统app可能就会有些吃力,不过经过一些配置仍然会 很简单.我们知道系统app因为涉及到一 ...

  10. Wavelet Ridgelet Curvelet Contourlet Ripplet

    Ripplet: A New Transform for Image Processing Jun Xu, Lei Yang and Dapeng Wu Ripplet: A New Transfor ...