2014-04-03 121 views
1

如何在不調用getWriter()方法的情況下檢查響應(ServletResponse)是否包含任何內容 - G。在過濾器?方法可能被用在程序以後別的地方調用(不 -檢查ServletResponse是否有任何內容

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    // Only do that if there is really some content 
    PrintWriter out = response.getWriter(); 

它可能發生的response.getWriter():或者換句話說:過濾器應只有在有已經寫東西到流修改內容這個過濾器,例如用於文件下載)。在這種情況下,第二次調用將失敗,因爲流已經打開......

回答

1

的方法之一是擴大ServletResponseWrapper並使用CharArrayWriter內部編寫的反應。 CharArrayWriter有一個size()方法,它將返回緩衝區的大小。確保你在過濾器鏈中傳遞一個包裝的響應,你應該能夠在程序中的任何一點獲得大小。

public class LengthAwareServletResponseWrapper extends ServletResponseWrapper { 

    private final CharArrayWriter out = new CharArrayWriter(); 

    public LengthAwareServletResponseWrapper(final ServletResponse response) { 
     super(response); 
    } 

    public int getWrittenContentLength() { 
     return out.size(); 
    } 

    @Override 
    public PrintWriter getWriter() throws IOException { 
     return new PrintWriter(out); 
    } 
} 
+0

我其實並不十分理解不能在responce對象上調用getWriter兩次,只要流沒有關閉。爲什麼這是不可能的? – sl3dg3

+0

我不確定你的意思是*無法兩次調用getWriter *。是否拋出異常? – Bart

+0

我更正了:我不能在同一個響應中調用getwriter()和getOutputStream()(如果我沒有記錯的話,會導致IllegalStateException),我不太明白爲什麼... – sl3dg3