/** * * 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(); //處理獲取到的響應的數據 }