2010-05-17 166 views
17

我正在使用Struts開發Java EE Web應用程序。問題在於Internet Explorer緩存。如果用戶註銷,他可以訪問某些頁面,因爲它們被緩存並且沒有請求。如果我刷新它的工作正常。同樣,如果用戶再次登錄頁面,它將不會重定向他,因爲該頁面也被緩存。防止IE高速緩存

兩種解決方案來我的腦海:

  1. 寫一個攔截器(如Servlet過濾器)添加到響應頭無緩存等
  2. 或者或將<meta>標籤在每一頁。

我該怎麼辦?

+1

您正在使用哪個版本的Struts? – laz 2010-05-17 12:53:17

+0

我發現添加no-cache頭並不總是在IE上工作。 – ziggy 2010-10-23 18:16:37

+0

顯然你忘記了'Expires'標題。另請參閱此問題中的答案。 – BalusC 2010-10-23 19:25:13

回答

27

而是設置頁面(一個或多個)有關的HttpServletResponse下列頭,這樣你就不需要手動copypaste它在所有網頁:

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

這相當於設置以下元頁面中的標題(手動):

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> 
<meta http-equiv="Pragma" content="no-cache"> 
<meta http-equiv="Expires" content="0"> 

另請參閱this answer。不要忘記在測試前先清除瀏覽器緩存;)

-1

使用no-cache等修改標題這是通常的方法。

+0

所以編寫一個攔截器更好......你能告訴我要添加哪個頭文件嗎?因爲我看到幾個標題應該放在 – GorillaApe 2010-05-17 12:25:23

5

我已經找到了以下工作得很好:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform, pre-check=0, post-check=0, private"); 
response.setHeader("Pragma", "no-cache"); 
response.setDateHeader("Expires", 0); 

從標籤在這個問題上,它看起來像你使用Struts。 Struts的1.x中,您可以通過在struts-config.xml配置做到這一點由controller元素設置nocache="true"

<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor" nocache="true" /> 

馬克諾丁漢的caching tutorial是我見過的網絡上有關HTTP和緩存的最佳資源如果你想了解更多。

這就是說,根據問題你看到它可能是一個瀏覽器歷史問題。有關詳細信息,請參見here

+0

順便說一句:只有你的例子中所示的前三個'Cache-Control'屬性足夠了,它們(和'Expires'頭部)已經「隱式地」將後續屬性設置爲所需的值。 – BalusC 2010-05-17 13:13:42

+0

我們在研究一個問題的同時研究了這些值,其中Opera用戶在註銷和銷燬會話後能夠在其瀏覽器歷史記錄中查看安全頁面。該值被用作修復。我試圖找到解釋這些設置是如何到達的原始鏈接,但迄今爲止我還沒有做到。雖然我只是在研究之後才瞭解瀏覽器緩存和瀏覽器歷史記錄之間的差異,但也許這是過度的。 – laz 2010-05-17 13:27:28

+0

確實有一個相關的Opera 8.x錯誤,在前十年中已經修復。在此瀏覽器中緩存重定向也沒有正確完成。但是現在幾乎沒有人使用Opera 8。 – BalusC 2010-05-17 13:53:18

2

看起來像IE <即使您有編譯指示,9仍然會緩存:頭部無緩存,並設置瀏覽器刷新每頁加載。在關閉html之前,您需要在第二個頭部分中再次添加元標記。這是來自MS本身。

http://support.microsoft.com/kb/222064/

這裏

http://www.htmlgoodies.com/beyond/reference/article.php/3472881/So-You-Dont-Want-To-Cache-Huh.htm

從測試你更好一點的解釋還需要在到期日:-1元標記,使其工作。建議使用Expires:-1而不是0.

0

將tag type =「button」添加到實際操作按鈕中。

類型屬性的默認值取決於當前文檔的兼容性模式。默認值是提交。在其他兼容模式下,默認值是按鈕。 當在表單中提交BUTTON元素時,該值取決於當前文檔的兼容性模式。 Windows Internet Explorer 8及更高版本。類型屬性的默認值取決於當前的文檔兼容性模式。在IE8標準模式下,默認值爲提交。在其他兼容模式和早期版本的Windows Internet Explorer中,默認值爲按鈕。 Internet Explorer 8及更高版本。當在窗體中提交BUTTON元素時,該值取決於當前文檔兼容性模式。在IE8模式下,value屬性被提交。在其他文檔模式和早期版本的Internet Explorer中,會提交innerText值。

http://msdn.microsoft.com/en-us/library/ie/ms535211(v=vs.85).aspx