可用來獲取HttpServletResponse響應的資料的包裝器類
阿新 • • 發佈:2018-12-28
/** * * MyResponseWrapper * 自定義HttpServletResponse包裝器類,在過濾器中使用,可用於獲取response響應的資料; * 使用方法:在過濾器中的doFilter方法中,建立這個類的物件,包裝原始的response, * 然後將包裝類物件作為引數傳遞給FilterChain的doFilter方法,並在這個doFiler方法執行完畢後, * 呼叫包裝器物件的getBytes方法即可獲取servlet響應的資料; * @author pf * @datetime 2016年4月28日 下午4:15:03 */ public class MyResponseWrapper extendsHttpServletResponseWrapper { 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(); //處理獲取到的響應的資料 }