session.invalidate()实际上并不清除JSF会话作用域值

时间:2011-02-03 14:14:32

标签: session jsf

我看到了这个问题中提到的类似问题 - https://stackoverflow.com/questions/1495390/how-do-i-invalidate-a-session-in-jsf

我有一个会话范围的LoginBean,它的操作注销为#

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    HttpSession session = (HttpSession) ec.getSession(false);
    HttpServletResponse response = (HttpServletResponse) ec.getResponse();

    // remove cookies
    response.addCookie(facade.removeCookie(((HttpServletRequest)ec.getRequest()).getCookies()));
    // check what we have in sessionMap
    System.out.println(ec.getSessionMap());
    // remove attribute
    session.removeAttribute("XYZ");

    // invalidate session
    if (session != null) {
        System.out.println("invalidating session");
        session.invalidate();
    }
    // see what is there in session map
    System.out.println(ec.getSessionMap());

它几乎可以正常工作。

输出#

{xyzBean=com.xyz.bean.XYZBean@46f046f0,... }
invalidating session
{}

sessionMap为空,表示没有会话范围bean。但是,在注销操作后,它会重定向到另一个相同的页面。登录是同一页面上的图层。我看到片段jsps仍然显示旧数据。

我没有删除facade.removeCookie中的JSESSIONID。它删除了一些与用户相关的其他cookie。

任何帮助将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:2)

您可能正在查看从浏览器缓存中提供的页面。您需要添加HTTP响应标头,指示Web浏览器不缓存动态页面。您可以使用映射到感兴趣的javax.servlet.Filter的{​​{1}}执行此操作,例如<url-pattern>或其他内容,并在*.jsf方法中完成以下工作:

doFilter()

在测试之前不要忘记清除浏览器缓存;)


与此问题无关,代码中的HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); // HTTP 1.1 httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0 httpResponse.setDateHeader("Expires", 0); // Proxies. chain.doFilter(request, response); nullcheck是多余的,因为当达到nullcheck时,session永远不会为null。如果它为null,则会在if (session != null)调用时抛出NullPointerException,因此永远不会达到nullcheck。