• 可用来获取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();
            //处理获取到的响应的数据
        }
  • 相关阅读:
    Sybase自增字段跳号处理
    Vault数据库还原/恢复问题
    值得一看的技术书
    原来爱一直在身边
    【转】VC++编程十大秘诀
    Qt 文件搜索
    字符串穷举算法(STL)
    C++ 流
    QML 学习(三)
    Qt Everything
  • 原文地址:https://www.cnblogs.com/pf1988/p/10191313.html
Copyright © 2020-2023  润新知