2011-04-26 47 views
3

我正在爲高速緩存創建一個servlet過濾器。這個想法是將響應主體緩存到memcached。由生成的響應體(結果是一個字符串):用於高速緩存的Servlet過濾器

response.getWriter().print(result); 

我的問題是,由於響應體將投入memcached的不加修飾,我還需要創建一個自定義HttpServletResponseWrapper?任何人都可以提供此過濾器的任何骨架代碼?

回答

2

您需要能夠捕獲過濾器中的servlet輸出。

爲此,您需要注入一個自定義的HttpServletResponseWrapper,收集發送到getWriter().print()某處的所有輸出,以便您可以將其交給memcached。

也許沿着線的東西:

ByteArrayOutputStream baos = new ByteArrayOutputStream(3000); 
    final PrintWriter w = new PrintWriter(new OutputStreamWriter(baos, "UTF-8")); 

    HttpServletResponse wrapper = new HttpServletResponseWrapper(response) { 

         @Override 
         public PrintWriter getWriter() throws IOException { 
          return w; 
         } 

        }; 

如果這是一個更大的項目,你必須在網絡基礎設施的控制,它也可能是一個好主意,在Java中沒有做到這一點,只是在Servlet容器前使用一個單獨的代理服務器。您可以控制通常緩存控制標頭應該緩存的內容(如果servlet尚未執行,可以使用篩選器設置它)。

+0

謝謝,這是否意味着即使響應主體不會被修改,HttpServletResponseWrapper也是必須的? – dolphincody 2011-04-26 01:34:44

+0

你還將如何去servlet的輸出?如果你什麼都不做,它會直接寫入瀏覽器的網絡連接,而你的過濾器不會看到任何內容。 – Thilo 2011-04-26 01:36:56

+0

謝謝,現在我該如何從包裝器中獲取響應體呢? – dolphincody 2011-04-26 02:04:23