/** * * 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(); //处理获取到的响应的数据 }