`

使用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

分享到:
评论

相关推荐

    解决JSP字符串乱码的过滤器

    总的来说,解决JSP字符串乱码的过滤器是通过Java Servlet Filter机制,在请求到达Servlet之前和响应离开Servlet之后,对字符编码进行统一管理,从而保证数据传输的正确性。通过配置和编写Filter,我们可以确保整个...

    servlet面试题集锦1

    `getServerInfoName()`和`getServerInfoVersion()`方法则分别用于提取服务器信息字符串中的名称和版本。 2. **获取客户端信息** Servlet同样可以获取客户端的一些信息,例如: - `ServletRequest.getRemoteHost()...

    servlet+filter+listener 详解

    * getParameterMap() :返回一个包含所有参数的 Map,为 key-String[] 模式,即,key 是表单控件的 name,同时,为了防止有重复 name 的控件存在,每个 name 对应的值是一个字符串数组。 Servlet 生命周期: ...

    nginx 隐藏版本号与WEB服务器信息的解决方法

    1. 在`ngx_http_header_filter_module.c`文件的第49行,将默认的服务器信息替换为你自定义的字符串,例如:"Server: Please guess it!"。 2. 接着,在`ngx_http_special_response.c`文件的第36行,同样替换为自定义...

    HttpClient以及获取页面内容应用

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

    监听器访问计数过滤非法字符

    在"过滤器实现页面自动编码"的情况下,我们通常会使用CharacterEncodingFilter来确保所有的HTTP请求和响应都使用正确的字符编码,如UTF-8。这可以防止由于字符编码不一致导致的乱码问题,提高用户体验。 过滤器的...

    cors-filter-1.7.jar java-util-1.9.1.jar

    这个库可能包含了一些帮助处理日期时间、字符串、集合、网络请求等常见任务的工具类。在处理CORS时,虽然它不是直接与CORS相关的,但可能会被用来辅助构建响应头或者进行其他辅助操作。 在Tomcat服务器中,我们可以...

    Ajax请求和Filter配合案例解析

    上述Java代码中,`SQLFilter`类实现了`Filter`接口,并在其`doFilter`方法中获取了所有请求参数,拼接成一个字符串`sql`。然后,通过`sqlValidate`方法进行检查,如果检查出存在潜在的SQL注入字符串,则拦截请求并...

    Filter&Listener&Ajax.pdf

    首先,Filter(过滤器)是JavaWeb中的一个重要组件,用于拦截用户请求和服务器响应,执行预处理或后处理操作。它允许开发者在请求到达目标资源(如Servlet、JSP)之前或之后添加额外的功能,例如权限检查、日志记录...

    用Filter来解决中文表单提交问题

    `Request`类中的`toChi()`方法用于将ISO-8859-1编码的字符串转换为GBK编码,这是处理从西方字符集转换到中文字符集的常见做法。当接收到POST请求时,`doFilter()`方法会调用`request.setCharacterEncoding("GBK")`来...

    中文乱码问题解决.pdf

    在实际的代码实现中,JSP页面应当设置正确的编码,并在获取请求参数后,使用ISO-8859-1转UTF-8的方法处理字符串。 在实际开发中,解决乱码问题不仅需要理解字符编码的基本原理,还需要对HTTP协议、浏览器行为以及...

    java字符编码监听器

    不同的编码格式(如ASCII、GBK、UTF-8等)可能对同一字符串有不同的表示,如果不统一编码标准,可能导致信息传输时的混乱。特别是在多语言环境下,UTF-8编码由于其广泛支持各种字符集,通常被推荐为首选编码。 2. *...

    字符编码

    在Java中,字符编码问题往往出现在输入输出流的处理、字符串的转换或者网络通信中。 在IT领域,"源码"和"工具"这两个标签表明这个话题可能包含了代码示例和实用工具来帮助理解和解决字符编码问题。源码可能是指Java...

    mina文件传输

    在"Mina文件及字符串传输"这个场景中,我们可以理解为利用Mina框架实现了一种服务,允许客户端通过发送字符串请求来获取服务器上的文件。这种功能在分布式系统、文件共享或者远程操作等场景中非常常见。下面我们将...

    B站整理的乐优商城笔记

    我们可以使用查询字符串来实现分页,并使用 LIMIT 和 OFFSET 语句来限制结果集的大小。 10. 结果集过滤: 在本节中,我们学习了如何实现结果集过滤。我们可以使用 WHERE 语句来实现结果集过滤,并使用 NOT IN 语句...

    json 中文乱码解决方案

    **假设场景**:一个简单的Java Web应用,使用Spring MVC框架,前端使用jQuery发起Ajax请求获取包含中文的JSON数据。 **步骤**: 1. **配置前端页面**: ```html &lt;!DOCTYPE html&gt; ...

    cors-filter-1.7.jar和java-property-utils-1.9.jar

    这个过滤器通常是基于Apache HTTP Components Filter库实现的,它能够配置允许哪些来源的请求,并控制哪些HTTP方法、头信息和响应内容可以被访问。在“jasperserver”中,这个过滤器可能用于确保跨域报告和数据查询...

    get与post乱码过滤器.zip

    3. **处理GET请求**:对于"GET"请求,Filter需要修改HttpServletRequest对象的查询字符串的解码方式,确保参数被正确地解析为指定的字符集。 4. **处理POST请求**:对于"POST"请求,Filter需要改变...

    cors-filter-1.7.jar,java-property-utils-1.9.jar两个包供学习使用.rar

    在Java中,属性文件通常用于存储配置信息,如数据库连接字符串、API密钥等。这个库提供了一些便利的方法,帮助开发者更方便地读取、写入和操作属性文件。例如,它可以用来动态更新运行时的配置,而无需重启应用。 ...

Global site tag (gtag.js) - Google Analytics