Java 防止IE缓存

Java 防止IE缓存,java,internet-explorer,jsp,struts,browser-cache,Java,Internet Explorer,Jsp,Struts,Browser Cache,我正在使用Struts开发一个JavaEEWeb应用程序。问题在于Internet Explorer缓存。如果用户注销,他可以访问一些页面,因为这些页面被缓存,并且没有请求。如果我点击刷新,它工作正常。此外,如果用户再次进入登录页面,它将不会重定向他,因为该页面也被缓存 我想到了两个解决方案: 编写一个拦截器(类似servlet过滤器)以添加到响应头中无缓存等 或在每页上放置标签 我应该做哪一个?修改没有缓存的标题等。这是通常的方法。而是在相关页面的HttpServletResponse上设置以

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

我想到了两个解决方案:

  • 编写一个拦截器(类似servlet过滤器)以添加到响应头中无缓存等
  • 或在每页上放置
    标签

  • 我应该做哪一个?

    修改没有缓存的标题等。这是通常的方法。

    而是在相关页面的
    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">
    
    这相当于在页面中手动设置以下元标题:

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

    另见。测试前不要忘记清除浏览器缓存;)

    我发现以下方法很有效:

    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" />
    
    
    
    如果你想了解更多,马克·诺丁汉是我在网上看到的关于HTTP和缓存的最好的资源


    也就是说,根据您看到的问题,可能是浏览器历史记录问题。请参阅以了解更多信息。

    看起来IE<9仍将缓存,即使头部中有pragma:no cache,并将浏览器设置为在每次加载页面时刷新。在关闭html之前,您需要在第二个head部分中再次添加meta标记。这是MS本身的观点

    这里没有更好的解释

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

    将tag type=“button”添加到实际操作按钮中

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


    所以写一个拦截器更好…你能告诉我要添加哪些标题吗?因为我看到了几个应该输入的头文件,您使用的是哪个版本的Struts?我发现添加无缓存头文件并不总是适用于IE。显然,您忘记了
    Expires
    头文件。另请参见此问题中的答案。@ziggy那么解决方案是什么?顺便说一句:仅示例中显示的前三个
    缓存控制
    属性就足够了,它们(以及
    过期
    头)已经“隐式”了将后续属性设置为所需的值。我们是在研究Opera用户在注销并销毁其会话后能够在浏览器历史记录中查看安全页面的问题时得出这些值的。该值被用作修复。我试图找到解释这些设置是如何实现的原始链接,但到目前为止我还没有找到。考虑到我只是在那次研究之后才了解到浏览器缓存和浏览器历史之间的差异,这可能有些过火了。实际上,在过去十年中,有一个相关的Opera 8.x错误被修复了。此外,在此浏览器中未正确缓存重定向。但是现在几乎没有人使用Opera 8。