2009-12-23 23 views
4

我創建的doFilter用下面的代碼一個Servlet過濾器:如何控制JSP頁面中的緩存?

HttpServletResponse httpResponse = (HttpServletResponse)response; 

httpResponse.setHeader("Cache-Control","no-cache"); 
httpResponse.setHeader("Pragma","no-cache"); 
httpResponse.setDateHeader("Expires", 0); 

chain.doFilter(request, response); 

我要確保沒有得到在客戶端和每一個請求(甚至可以從瀏覽器的後退按鈕,一個人的)被定向到緩存服務器。

但是,即使在實現上述過濾器之後,一些頁面也被緩存(可以使用瀏覽器的後退按鈕訪問)。

和其他未緩存的頁面,顯示網頁已過期 Internet Explorer中的錯誤。

回答

10

要啓動,完整集是:

httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
httpResponse.setDateHeader("Expires", 0); // Proxies. 

no-storemust-revalidate需要得到它的工作在每個下的Firefox。

但是,即使在實現上述過濾器之後,某些頁面也被緩存(可以使用瀏覽器的後退按鈕訪問)。

你是怎麼測試它的?這些標題實際上會阻止瀏覽器從瀏覽器緩存請求頁面,而不是直接從服務器請求頁面。最好的測試是有一個Filter聽上/*和風味添加調試語句:

HttpServletRequest httpRequest = (HttpServletRequest) request; 
String method = httpRequest.getMethod(); 
String URI = httpRequest.getRequestURI(); 
System.out.println(method + " request invoked on " + URI); 

這應該打印的實際需求。

此外,請確保您不使用HTML <meta>標記覆蓋JSP頁面本身的標題。

並且沒有緩存的其他頁面,顯示網頁在Internet Explorer過期錯誤。

你只能得到這個,如果非緩存請求是POST請求,而不是一個GET請求。 GET請求將僅從服務器再次請求,而不是從瀏覽器緩存中請求。

0

我們還使用Last-Modified標題鼓勵瀏覽器始終獲得新版本。

setDateHeader("Last-Modified", (new Date()).getTime()); // Set last modified to right now.

我不知道關於使用緩存保持瀏覽器的後退按鈕,雖然。只有在頁面首次加載時纔會對頭標字段進行評估,IIRC。