2010-05-17 167 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