【问题标题】:Disable webpage caching for browser forward/back buttons禁用浏览器前进/后退按钮的网页缓存
【发布时间】:2013-11-14 03:25:42
【问题描述】:

我正在使用以下元标记来防止页面的浏览器缓存:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Vary" content="*" />

案例:

  1. 浏览器已经用page1打开。
  2. 新链接已粘贴到浏览器地址栏中,现在安全页面page2 已打开。
  3. 用户对page2 执行操作并被重定向到page3

当点击page3 上的返回按钮时,用户会被重定向到page1(没有缓存并且在这种情况下可以正常工作)。当用户点击page1 上的转发按钮时,用户将被转发到安全页面page2。这不应该发生。

以上都是在IE9上测试的。

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 如果我在某些方面有误,而不仅仅是投反对票,投反对票的人可以纠正我吗?
  • 总是使用网络过滤器来防止浏览器缓存您的页面,请参阅此网页过滤器代码stackoverflow.com/questions/19018130/…
  • + 赞成不合理的反对票
  • @hanan Ahmed,这个过滤器到底是做什么的?
  • 快速说明:似乎没有必要同时使用post-check=0, pre-check=0。它甚至可能导致某些浏览器出现意外行为!在此处查看更多信息:blogs.msdn.com/b/ieinternals/archive/2009/07/20/…

标签: html internet-explorer jsf cross-browser


【解决方案1】:

您对 HTML &lt;meta http-equiv&gt; 标记的初始尝试指定了 right header values,但是,这根本不起作用,因为您的页面已经通过 HTTP 提供。 &lt;meta http-equiv&gt; 标头指定“HTTP 等效”标头,这些标头仅在使用 HTTP 协议提供页面时使用。

例如,当从本地磁盘文件系统打开页面时,就像您在本地磁盘文件系统资源管理器中双击 .html 文件一样。这将通过file:// URI 而不是http:// URI 打开.html 文件。

您应该在 real HTTP 响应中设置这些标头。您可以通过在 Chrome/FireFox>=23/IE>=9 中按 F12 并在 Network 选项卡中探索 HTTP 流量来调查当前 HTTP 响应的标头。如果是IE9/10,点击开始捕获按钮,重新加载页面,选择HTML页面,点击Go to detail view按钮,最后点击响应标头 选项卡。这是您当前问题在 IE10 中的屏幕截图:

让这些标头最终出现的正确方法是使用HttpServletResponse#setHeader()setDateHeader()addHeader() 等朋友。如您所想,一种方法是servlet 过滤器。

另见:

【讨论】:

    【解决方案2】:

    我发现最好的解决方案是以下过滤器:

    import java.io.IOException;
    import javax.faces.application.ResourceHandler;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet Filter implementation class NoCacheFilter
     */
      @WebFilter(urlPatterns = {"*.xhtml"})
      public class NoCacheFilter implements Filter {
    
    /**
     * Default constructor. 
     */
    public NoCacheFilter() {
        // TODO Auto-generated constructor stub
    }
    
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
    
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
    
        // apply no caching for all web pages except resources, you can customize that to be applied for specific pages
        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }
    
        chain.doFilter(request, response);
    }
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
    
    }
    

    根据这个问题的答案:

    Redirect to login page when user clicks on back button after logout in JSF

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2011-08-06
      • 2010-10-31
      • 2015-10-22
      相关资源
      最近更新 更多