甚至在单击后退按钮后从应用程序注销后,它会记录到先前登录浏览器的用户?

时间:2012-06-18 05:09:56

标签: java jsf

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

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

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

以上代码在IE和Firefox中运行良好,但在谷歌浏览器中没有,

任何人都可以通过谷歌浏览器解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您需要更改以下内容:

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

为:

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

阅读this帖子以获取进一步说明。

答案 1 :(得分:1)

这里有两个错误:

  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模式上使用自定义过滤器,需要检查已登录用户的存在并处理重定向到登录页面,那么您也可以在改为使用相同的过滤器。