java使用Filter过滤器对Response返回值进行修改_menghuanzhiming的博客-程序员宅基地_filter过滤器返回response工具类

技术标签: filter  

有时候在开发过程中会有这样一个场景,有时需要对返回的数据进行处理。比如加密啊,添加某些标记啊等等。这种情况我们可以通过过滤器去处理。
过滤器是什么就不介绍了,百度一下,你就知道。

看看代码吧:

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

自定义response包装类ResponseWrapper:

package com.channel.filter;


import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;


/**
 * 返回值输出代理类
 * 
 * @Title: ResponseWrapper
 * @Description:
 * @author kokJuis
 * @date 上午9:52:11
 */
public class ResponseWrapper extends HttpServletResponseWrapper
{
    

    private ByteArrayOutputStream buffer;

    private ServletOutputStream out;

    public ResponseWrapper(HttpServletResponse httpServletResponse)
    {
        super(httpServletResponse);
        buffer = new ByteArrayOutputStream();
        out = new WrapperOutputStream(buffer);
    }

    @Override
    public ServletOutputStream getOutputStream()
        throws IOException
    {
        return out;
    }

    @Override
    public void flushBuffer()
        throws IOException
    {
        if (out != null)
        {
            out.flush();
        }
    }

    public byte[] getContent()
        throws IOException
    {
        flushBuffer();
        return buffer.toByteArray();
    }

    class WrapperOutputStream extends ServletOutputStream
    {
        private ByteArrayOutputStream bos;

        public WrapperOutputStream(ByteArrayOutputStream bos)
        {
            this.bos = bos;
        }

        @Override
        public void write(int b)
            throws IOException
        {
            bos.write(b);
        }

        @Override
        public boolean isReady()
        {

            // TODO Auto-generated method stub
            return false;

        }

        @Override
        public void setWriteListener(WriteListener arg0)
        {

            // TODO Auto-generated method stub

        }
    }

}

过滤器类:


package com.channel.filter;


import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import com.channel.util.RsaEncryptUtil;


/**
 * 返回值输出过滤器,这里用来加密返回值
 * 
 * @Title: ResponseFilter
 * @Description:
 * @author kokJuis
 * @date 上午9:52:42
 */
public class ResponseFilter implements Filter
{

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
        throws IOException, ServletException
    {
        ResponseWrapper wrapperResponse = new ResponseWrapper((HttpServletResponse)response);//转换成代理类
        // 这里只拦截返回,直接让请求过去,如果在请求前有处理,可以在这里处理
        filterChain.doFilter(request, wrapperResponse);
        byte[] content = wrapperResponse.getContent();//获取返回值
<span style="white-space:pre">  </span>//判断是否有值
        if (content.length > 0)
        {

            String str = new String(content, "UTF-8");
            System.out.println("返回值:" + str);
            String ciphertext = null;

            try
            {
                //......根据需要处理返回值
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
<span style="white-space:pre">      </span>//把返回值输出到客户端
            ServletOutputStream out = response.getOutputStream();
            out.write(ciphertext.getBytes());
            out.flush();
        }

    }

    @Override
    public void init(FilterConfig arg0)
        throws ServletException
    {

    }

    @Override
    public void destroy()
    {

    }

}

web.xml下添加配置即可

    <!-- 返回值过滤器 -->
    <filter>
        <filter-name>responseFilter</filter-name>
        <filter-class>com.im.filter.ResponseFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>responseFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/menghuanzhiming/article/details/79296459

智能推荐

计算机二级Python真题(十)_IT 小哥哥的博客-程序员宅基地_函数能同时返回多个参数值,需要形成一个列表来返回

第十套真题1、数据库系统的核心是___________。A.数据库管理系统B.数据模型C.软件工具D.数据库正确答案: A2、下列叙述中正确的是___________。A.线性表链式存储结构的存储空间可以是连续的,也可以是不连续的B.线性表链式存储结构与顺序存储结构的存储空间都是连续的C.线性表链式存储结构的存储空间必须是连续的D.线性表链式存储结构的存储空间一般要少于顺序存储结构正确答案: A3、某二叉树共有12个结点,其中叶子结点只有1个。则该

cakephp $this->html->css,Cakephp只加载一个.css文件 - 403-所有其他错误_溯水襄陵的博客-程序员宅基地

我用cakephp。我的apache的web根文件夹是/ home/jw/www。我的项目是在/ home/JW/WWW/HC2,所以整体的文件夹结构(仅适用于这个问题很重要的部分)为:www/hc2/app/webrootindex.php/css/cake.generic.css/any.css/other.css/stylesheets.css/js/any.js/javascript.js...

SpringBoot整合RocketMQ_我能在河边钓一整天的鱼的博客-程序员宅基地

环境搭建导入依赖 &lt;parent&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;2...

数据访问:MyBatis-Plus&Druid数据源_len(陈憨憨)的博客-程序员宅基地

数据访问:MyBatis-Plus&amp;Druid数据源SpringBoot集成MyBatis-PlusMyBatis-Plus简介Lombok简介和安装添加CRUD接口分页插件代码生成器SpringBoot集成Druid数据源Druid简介Druid的优势SpringBoot集成Druid数据源SpringBoot集成MyBatis-PlusMyBatis-Plus简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为

bugku web知识点总结_2_compact disk的博客-程序员宅基地

bugku web总结(14-24)web14:打开题目,可以看到一个链接click me点击后显示了index.php,可能提示flag存在index.php中如上图我们还可以看到多了一个参数file,很像是文件包含,这里我们可以尝试使用php伪协议读取文件内容,放上一个介绍php伪协议的文章链接https://segmentfault.com/a/1190000018991087构造payload:php://filter/read=convert.base64-encode/resour

ajax可以写哎哟,跨域 - SegmentFault 思否_美界柯南的博客-程序员宅基地

域名相同 (都是http://jirengu.com/a&gt; 和 和...2、Ajax 跨域报错实例(1)修改host文件:给host文件里添加两条记录,方便跨域操作上图意思是访问 a.com 或是 b.com 相当于访问本机, 可以实现一个场景:浏览器是a.com,而接口是b.com,虽说最终对应的是本机,但是域名不一样(2)建一个index.html文件,获取数据hello worldva...

随便推点

SGU175-Encoding_bingsanchun的博客-程序员宅基地

Let phi(W) is the result of encoding for algorithm: 1. If the length of W is 1 then phi(W) is W; 2. Let coded word is W = w1w2...wN and K = N / 2 (rounded down); 3. phi(W) = phi(wNwN-1...wK+1) +

深入 Lucene 索引机制_shoppingbill的博客-程序员宅基地

深入 Lucene 索引机制 周 登朋 ([email protected]), 研究生, 上海交通大学周登朋,上海交通大学研究生,目前在IBM上海国际化实验室(SGL)实习,对Java技术以及信息检索技术非常感兴趣,你可以通过 [email protected]来联系他. 简介:  Lucene 是一个基于 Jav...

ES6字符串匹配函数_程序员的脱发之路的博客-程序员宅基地_es6 字符串匹配

ES6字符串匹配函数一、三个匹配函数1. Arrary.includes()2. Arrary.startsWith()3. Arrary.endsWith()二、具体使用1. Arrary.includes()2. Arrary.startsWith()3. Arrary.endsWith()三、拓展使用一、三个匹配函数1. Arrary.includes()includes(searchString,options):字符串是否包含指定值。searchString:要搜索的字串(字符串类型)p

算法 设计 与 分析_洛城luo的博客-程序员宅基地

1.数据结构是数据的组织方法 ,而算法数据的处理方法2.算法分析主要是分析其正确性和运行性能3.算法主要面对问题类型:排序,查找,串处理,图问题,组合问题,几何问题,数值问题4.我们约定C(n)为基本操作执行次数,Cop为基本操作执行时间,那么T(n)=C(n)*Cop5.增长次数从小到大排列 n,log2n,nlog2n,n的平方,n的立方,二的n次方,n阶乘!!!1.分析非递归算法效率的通用方案:决定用哪个(哪些)参数作为输入规模的度量找出算法的基本操作检查基本操作的...

项目:客户端访问SQL serve服务_weixin_33739541的博客-程序员宅基地

客户端访问SQL serve服务 环境:域中SQL server 群集(2台),域服务器1台,操作系统:windows server r2 SQL版本:SQL server 2008步骤:1、在SQL Server网络配置上启动TCP/IP。2、在SQL Server Management Studio对象资源管理器中选择m...

Flask实战第59天:首页帖子布局完成_weixin_30292745的博客-程序员宅基地

编辑front_index.html&lt;div id="carousel-example-generic" class="carousel slide index-banner" data-ride="carousel"&gt; ...&lt;div class="post-group"&gt; &lt;ul class="post-group-head"&gt...

推荐文章

热门文章

相关标签