java使用Filter过滤器对Response返回值进行修改
转: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返回值进行修改的更多相关文章
- 转:java使用Filter过滤器对Response返回值进行修改
练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过滤器对Response返回值进行修改 有时候在开发过程中会有这样一个 ...
- Java线程:新特征-有返回值的线程
http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...
- JAVA 多线程 Callable 与 FutureTask:有返回值的多线程
java多线程中,如果需要有返回值,就需要实现Callable接口. 看例子: 先建立一个Dowork这个类,就是平时某个业务的实现 package com.ming.thread.one; impo ...
- 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法
066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法
065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法
064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...
- 063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法
063 01 Android 零基础入门 01 Java基础语法 08 Java方法 01 无参无返回值方法 本文知识点:无参无返回值方法 无参无返回值方法 案例 为什么使用方法?--方便复杂问题调用 ...
- 【Servlet】Java Serlvet Filter 过滤器
Filter的设计思想Filter是一种AOP(aspect-oriented programming)的设计思想 : 面向切面编程.用于的请求和响应都会走 使用filter的登录案例我们通过一张图片 ...
- 拦截器HandlerInterceptorAdapter的postHandle和afterCompletion无法获取response返回值问题
缘起 有一个需求,在进入controller之前验证调用次数是否超过限制,在响应之后判断是否正常返回,对调用次数进行+1,发现带@RestController的类和带@ResponseBody的方法在 ...
随机推荐
- 弄懂Kafka的消息流转过程
原文地址:https://www.cnblogs.com/chanshuyi/p/quick_start_of_kafka.html 大家都知道 Kafka 是一个非常牛逼的消息队列框架,阿里的 Ro ...
- 使用composer遇到的坑
平台:Windows下cmd命令行內 問題 [Composer\Downloader\TransportException] The "https://packagist.phpcompos ...
- wakatime记录 coding时间的工具
想记录下自己每天coding 的时间以及每个在各个项目上coding的时间,之前一直也没有什么好的办法,无意之间发现wakatime这个插件可以记录自己每天有效的coding时间. wakatime ...
- 从已删除邮箱copy数据到活动邮箱
Start Windows PowerShell Start > search for "PowerShell" > Start Windows PowerShell ...
- DLL简单分析与调用方法
最近为了分析一个没有代码的DLL有哪些函数,找了各种方法. 把结果分享一下:三个方法都没法得到函数的参数,有点让我失望. DLL Export Viewer NikPEViewer Dumpbin 配 ...
- PHP 概览
运行环境 Windows Linux Centos Ubuntu MacOS 编辑器 编码风格 依赖管理 Composer 发布包 热门框架 热门类库 热门系统 架构支持 源码分析 扩展开发
- 给Linux系统新增加一块硬盘
今天公司测试Linux服务器硬盘不够用了,主要是mysql数据文件太大了,买了个500G的硬盘回来,这里记录下新加硬盘的方法PS 测试服务器的主板太差劲了,没有多余的电源接口,只能把光驱的电源拿出来, ...
- Oracle中 to_date和to_char用法
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- 检查邮箱IP是否在国际反垃圾邮件组织的黑名单中
有时候邮件发不出去,很有可能就是邮件服务器的IP被国际上一些反垃圾组织列入黑名单了,这时你可以通过返回的邮件判断是否进入黑名单,或者通过以下查询地址看是否被列入,然后一个个申请移除: http://m ...
- Layout-3相关代码:3列布局代码演化[二]
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...