【问题标题】:Prevent IE caching防止 IE 缓存
【发布时间】:2011-02-20 09:27:07
【问题描述】:

我正在使用 Struts 开发一个 Java EE Web 应用程序。问题在于 Internet Explorer 缓存。如果用户注销,他可以访问某些页面,因为它们被缓存并且没有请求。如果我点击刷新它工作正常。此外,如果用户再次进入登录页面,它不会重定向他,因为该页面也被缓存了。

我想到了两个解决方案:

  1. 编写拦截器(类似 servlet 过滤器)以添加到响应标头无缓存等。
  2. 或者在每个页面上放置<meta>标签。

我应该做哪一个?

【问题讨论】:

  • 您使用的是哪个版本的 Struts?
  • 我发现在 IE 上添加 no-cache 标头并不总是有效。
  • 显然您忘记了 Expires 标头。另请参阅此问题中的答案。
  • @ziggy 那么解决方案是什么?

标签: java internet-explorer jsp struts browser-cache


【解决方案1】:

将标签 type="button" 添加到实际操作按钮中。

type 属性的默认值取决于当前文档的兼容模式。默认值为提交。在其他兼容模式下,默认值为 button。 当 BUTTON 元素在表单中提交时,其值取决于当前文档的兼容模式。 Windows Internet Explorer 8 及更高版本。 type 属性的默认值取决于当前文档的兼容模式。在 IE8 标准模式下,默认值为提交。在其他兼容模式和早期版本的 Windows Internet Explorer 中,默认值为 button。 Internet Explorer 8 及更高版本。当 BUTTON 元素在表单中提交时,其值取决于当前文档的兼容模式。在 IE8 模式下,提交 value 属性。在其他文档模式和早期版本的 Internet Explorer 中,会提交 innerText 值。

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

【讨论】:

    【解决方案2】:

    看起来 IE

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

    这里稍微解释一下

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

    通过测试,您还需要 Expires: -1 元标记才能使其工作。建议使用 Expires: -1 而不是 0。

    【讨论】:

      【解决方案3】:

      我发现以下方法效果很好:

      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" />
      

      Mark Nottingham 的 caching tutorial 是我在网上看到的关于 HTTP 和缓存的最佳资源,如果您想了解更多信息。

      话虽如此,根据您看到的问题,它可能是浏览器历史记录问题。有关更多信息,请参阅here

      【讨论】:

      • 顺便说一句:只有您的示例中显示的前三个 Cache-Control 属性就足够了,它们(和 Expires 标头)已经“隐式”将后续属性设置为所需的值。跨度>
      • 我们在研究 Opera 用户在注销并销毁会话后能够在浏览器历史记录中查看安全页面的问题时得出了这些值。该值被用作修复。我正在尝试找到解释这些设置是如何到达的原始链接,但到目前为止我还没有找到。考虑到我只是在那次研究之后才了解浏览器缓存和浏览器历史记录之间的差异,也许这有点过头了。
      • 确实存在一个相关的 Opera 8.x 错误,该错误已在前十年中修复。此浏览器中的重定向缓存也未正确完成。但现在几乎没有人使用 Opera 8。
      【解决方案4】:

      而是在相关页面的HttpServletResponse 上设置以下标题,这样您就无需手动将其复制粘贴到所有页面:

      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。测试前别忘了清除浏览器缓存;)

      【讨论】:

        【解决方案5】:

        用no-cache等修改标题。这是通常的方式。

        【讨论】:

        • 所以写一个拦截器更好...你能告诉我要添加哪些标题吗?因为我看到几个应该放的标题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 2012-10-19
        • 2020-05-27
        相关资源
        最近更新 更多