2

在应用程序中,当用户注销并按下浏览器后退按钮时,它会将特定用户带到上一页(以前一个用户身份登录)。

当用户在索引(登录)页面中注销时,我尝试了以下代码来清除缓存

<%
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setHeader("Expires", "0");
response.setDateHeader("Expires", -1);
%>

上面的代码在 IE 和 firefox 中运行良好,但在 google chrome 中不行,

谁能帮助我用谷歌浏览器解决这个问题。

提前致谢 。

4

2 回答 2

1

这里有2个错误:

  1. 标题Cache-Control不完整。完整的正确标题集是:

    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.
    

    确保在测试之前清除浏览器缓存。

  2. 必须在受限页面的响应中设置这些标头,而不仅仅是在登录页面上。最简单的方法是创建一个 servlet 过滤器,该过滤器映射到与受限页面相同的 URL 模式,并在doFilter()方法中设置这些标题。

    public class NoCacheFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            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.
            chain.doFilter(req, res);
        }
    
        // ...
    }
    

    如果您已经在受限页面的 URL 模式上使用了自定义过滤器,该过滤器需要检查登录用户的存在并处理重定向到登录页面,那么您也可以在同一个过滤器中完成这项工作反而。

于 2012-06-18T12:29:39.697 回答
1

您需要更改以下内容:

response.setHeader("Cache-Control", "no-store");

至:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

阅读这篇文章以获得进一步的描述。

于 2012-06-18T05:15:04.120 回答