`

使用Filter获取服务器响应内容(字符串)

阅读更多

spring mvc架构的web应用中,spring框架将数据model渲染至jsp页面并将最终结果输出到客户端,model和jsp模板可以由程序定义,但是页面渲染及结果输出过程是由spring封装,对程序员来说是不可控的。想要取得输出的内容有一种方法就是自定义ServletOutputStream对象,在数据写入至目标流同时写入我们自定义的字节流,通过字节流便可取得输出内容。代码如下:

 

public class CustomServletOutputStream extends ServletOutputStream {

 

    private OutputStream outputStream;

    private ByteArrayOutputStream byteArrayOutputStream;

 

    public CustomServletOutputStream(OutputStream outputStream){

        this.outputStream=outputStream;

        byteArrayOutputStream=new ByteArrayOutputStream();

    }

 

    @Override

    public boolean isReady() {

        return false;

    }

 

    @Override

    public void setWriteListener(WriteListener writeListener) {

 

    }

 

    @Override

    public void write(int b) throws IOException {

        outputStream.write(b);

        byteArrayOutputStream.write(b);

    }

 

    public byte[] getCopy(){

        return byteArrayOutputStream.toByteArray();

    }

}

 

自定义response类为获取字节流数据提供接口

 

public class CustomHttpServletResponse extends HttpServletResponseWrapper {

 

    private ServletOutputStream outputStream;

    private PrintWriter writer;

    private CustomServletOutputStream cout;

 

    /**

     * Constructs a response adaptor wrapping the given response.

     *

     * @throws IllegalArgumentException

     *          if the response is null

     */

    public CustomHttpServletResponse(HttpServletResponse response) {

        super(response);

    }

 

    @Override

    public ServletOutputStream getOutputStream() throws IOException {

        if (writer != null) {

            throw new IllegalStateException("getWriter() has already been called on this response.");

        }

 

        if (outputStream == null) {

            outputStream = getResponse().getOutputStream();

            cout = new CustomServletOutputStream(outputStream);

        }

        return cout;

    }

 

    @Override

    public PrintWriter getWriter() throws IOException {

        if (outputStream != null) {

            throw new IllegalStateException("getOutputStream() has already been called on this response.");

        }

 

        if (writer == null) {

            cout = new CustomServletOutputStream(getResponse().getOutputStream());

            writer = new PrintWriter(new OutputStreamWriter(cout, getResponse().getCharacterEncoding()), true);

        }

        return writer;

    }

 

    @Override

    public void flushBuffer() throws IOException {

        if (writer != null) {

            writer.flush();

        } else if (outputStream != null) {

            cout.flush();

        }

    }

 

    public byte[] getCopy() {

        if (cout != null) {

            return cout.getCopy();

        } else {

            return new byte[0];

        }

    }

}

 

Filter类

 

public class LXCFFilter implements Filter {

 

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws      IOException, ServletException {

        HttpServletRequest hrequest=(HttpServletRequest)request;

        CustomHttpServletResponse cresponse=new CustomHttpServletResponse((HttpServletResponse)response);

        chain.doFilter(request,cresponse);

//      cresponse.flushBuffer();

        byte[] data=cresponse.getCopy();

        String htmStr=new String(data,response.getCharacterEncoding());

        //do something

        }

 

    @Override

    public void destroy() {

    }

}

 

在web.xml中添加filter

 

    <filter>

        <filter-name>lxcfFilter</filter-name>

        <filter-class>com.gtan.lxcf.common.LXCFFilter</filter-class>

    </filter>

    <filter-mapping>

        <filter-name>lxcfFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

 

参考链接 http://stackoverflow.com/questions/8933054/how-to-log-response-content-from-a-java-web-server

分享到:
评论

相关推荐

    HttpClient以及获取页面内容应用

    通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。 ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer???? ...

    Python编程入门经典

    1.3 开始使用Python——字符串 6 1.3.1 字符串概述 6 1.3.2 为什么需要引号 6 1.3.3 为什么有3种类型的引号 7 1.3.4 使用print()函数 7 1.3.5 理解不同的引号 8 1.4 串联两个字符串 10 1.5 用不同的方法串联字符串 ...

    C++网络爬虫项目

    将原始形态的统一资源定位符字符串,解析为服务器域名、资源路径、服务器 IP地址,乃至服务器通信端口等。WEBCRAWLER 网络爬虫实训项目 8 2.2.5. 统一资源定位符队列(UrlQueues) 封装原始统一资源定位符队列和解析...

    powerbuilder

    由于PowerBuilder使用数值0(即ASCII码为0的字符)结束每个字符串,因此,如果打印控制序列中包含了数值0,应用程序需要使用其它字符在参数string中替代数值0,并用zerochar参数指明这个替代字符。一般来说,应该...

    C#全能速查宝典

    1.4.29 LastIndexOf方法——确定字符在字符串中最后索引 70 1.4.30 Matches方法——检查字符串是否有重复的词出现 71 1.4.31 MONTH函数——返回指定日期中月部分的整数 73 1.4.32 PadLeft方法——在左边用空格填充 ...

    疯狂Android讲义源码

     6.2.3 使用字符串、颜色、  尺寸资源 219  6.3 数组(Array)资源 222  6.4 使用(Drawable)资源 225  6.4.1 图片资源 225  6.4.2 StateListDrawable资源 225  6.4.3 LayerDrawable资源 227  6.4.4 ...

    filter:CoreDNS插件,可基于预定义列表进行查询过滤

    正则表达式和简单的字符串匹配支持。 检查CNAME,SVCB和HTTPS记录可检测并阻止伪装。 阻止回复完全可以被缓存插件缓存。 句法 filter { allow FILE block FILE uncloak ttl DURATION } allow FILE加载到白名单...

    疯狂Android讲义.part2

    6.2.3 使用字符串、颜色、 尺寸资源 219 6.3 数组(Array)资源 222 6.4 使用(Drawable)资源 225 6.4.1 图片资源 225 6.4.2 StateListDrawable资源 225 6.4.3 LayerDrawable资源 227 6.4.4 ShapeDrawable资源 229 ...

    疯狂Android讲义.part1

    6.2.3 使用字符串、颜色、 尺寸资源 219 6.3 数组(Array)资源 222 6.4 使用(Drawable)资源 225 6.4.1 图片资源 225 6.4.2 StateListDrawable资源 225 6.4.3 LayerDrawable资源 227 6.4.4 ShapeDrawable资源 229 ...

    flex3的cookbook书籍完整版dpf(包含目录)

    使用查询字符串传递数据给模块 22.12节.使用连接报告优化模块 第二十三章.Adobe Integrated Runtime API(694) 23.1节.借助FlexFramework创建一个AIR程序 23.2节.理解AIR命令行工具 23.3节.打开和管理本地窗体 23.4节...

    Nginx安装包

    我这里为了方便,就用fastjson将对象转为字符串存入了,查看起来也方便点。 另外个人中心页面很简单。 现在已经完成测试前的全部工作了,开始测试吧。 启动tomcat1,在浏览器中输入localhost:8080,进入我们的登录...

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版

    精通windows server 2008 命令行与powershell 电子书PDF单文件完整版 内容简介: 本书全面地介绍了Windows Server 2008命令行、PowerShell和脚本的使用,包括...10.4.5 ]sysy[ ]sysy[——允许在字符串中包含空格 473...

    精通windows server 2008 命令行与powershell电子书PDF版(第一卷)

    《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...

    精通windows server 2008 命令行与powershell 电子书PDF版(第四卷)

    《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...

    精通windows server 2008 命令行与powershell电子书PDF版(第三卷)

    《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...

    精通windows server 2008 命令行与powershell电子书PDF版(第二卷)

    《精通Windows Server 2008命令行与PowerShell》的内容简介回到顶部↑ 本书全面地介绍了windows server 2008命令行、powershell和脚本的使用,包括文件和文件夹的管理、磁盘管理、系统管理、活动目录管理、网络管理...

    asp.net知识库

    .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...

Global site tag (gtag.js) - Google Analytics