可用来获取HttpServletResponse响应的数据的包装器类

/**
 * 
 * MyResponseWrapper
 * 自定义HttpServletResponse包装器类,在过滤器中使用,可用于获取response响应的数据;
 * 使用方法:在过滤器中的doFilter方法中,创建这个类的对象,包装原始的response,
 * 然后将包装类对象作为参数传递给FilterChain的doFilter方法,并在这个doFiler方法执行完毕后,
 * 调用包装器对象的getBytes方法即可获取servlet响应的数据;
 * @author 大别山人
 * @datetime 2016年4月28日 下午4:15:03
 */
public class MyResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    private PrintWriter pwrite;
    public MyResponseWrapper(HttpServletResponse response) {
        super(response);
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new MyServletOutputStream();
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        try{
            pwrite = new PrintWriter(new OutputStreamWriter(bytes, "utf-8"));
        } catch(UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return pwrite;
    }
    /**
     * 
     * 获取响应数据
     * @param 
     * @return byte[]
     * @throws
     * @author pf
     * @datetime 2016年4月28日 下午4:23:33
     */
    public byte[] getBytes() {
        if(null != pwrite) {
            pwrite.close();
            return bytes.toByteArray();
        }
        if(null != bytes) {
            try {
                bytes.flush();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        return bytes.toByteArray();
    }
    private class MyServletOutputStream extends ServletOutputStream {
        @Override
        public void write(int b) throws IOException {
            bytes.write(b); // 将数据写到 stream 中
        }
        @Override
        public boolean isReady() {
            return false;
        }
        @Override
        public void setWriteListener(WriteListener writeListener) {
        }
    }
}

 在Filter中使用演示:

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //将参数response的类型强制转换为使用Http协议的HttpServletResponse类型
        HttpServletResponse httpResp = (HttpServletResponse) response;
        //创建包装器对象,包装原始的response对象
        MyResponseWrapper respWrapper = new MyResponseWrapper(httpResp);
        //继续执行过滤器链的doFilter方法,使用上面的包装器对象做参数
        chain.doFilter(request, respWrapper);
        //过滤器方法执行完毕,通过包装器对象获取缓存在包装器中的响应的数据
        byte[] bytes = respWrapper.getBytes();
        //处理获取到的响应的数据
    }

 

posted on 2018-12-28 16:25  大别山人  阅读(2658)  评论(0编辑  收藏  举报