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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM