1. 程式人生 > >可用來獲取HttpServletResponse響應的資料的包裝器類

可用來獲取HttpServletResponse響應的資料的包裝器類

/**
 * 
 * MyResponseWrapper
 * 自定義HttpServletResponse包裝器類,在過濾器中使用,可用於獲取response響應的資料;
 * 使用方法:在過濾器中的doFilter方法中,建立這個類的物件,包裝原始的response,
 * 然後將包裝類物件作為引數傳遞給FilterChain的doFilter方法,並在這個doFiler方法執行完畢後,
 * 呼叫包裝器物件的getBytes方法即可獲取servlet響應的資料;
 * @author pf
 * @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();
        //處理獲取到的響應的資料
    }