您需要能夠捕獲過濾器中的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尚未執行,可以使用篩選器設置它)。
謝謝,這是否意味着即使響應主體不會被修改,HttpServletResponseWrapper也是必須的? – dolphincody 2011-04-26 01:34:44
你還將如何去servlet的輸出?如果你什麼都不做,它會直接寫入瀏覽器的網絡連接,而你的過濾器不會看到任何內容。 – Thilo 2011-04-26 01:36:56
謝謝,現在我該如何從包裝器中獲取響應體呢? – dolphincody 2011-04-26 02:04:23