为什么我不能在用户注销时销毁http会话?

时间:2014-10-22 19:04:34

标签: jsf session authentication javabeans invalidation

有没有什么好的理由不简单地破坏HTTP会话,如:

FacesContext facesContext = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
session.invalidate();

而不仅仅是取消验证用户并确保从会话范围的bean中清除用户数据?

2 个答案:

答案 0 :(得分:3)

你必须做到这两点。取消验证用户可能取决于您的实施。如果您呼叫第三方系统以获取用户的安全令牌,则可能需要再次回叫以使令牌无效。

您还必须使HttpSession无效。使会话无效将释放所有会话范围的bean。它还为用户会话期间访问的页面释放JSF视图状态和组件树。这些会使会话变得相当大而且无效会使堆满的会话等待超时并对服务器的容量产生负面影响。

顺便说一句,您可以在不需要获取HttpSession的情况下使会话无效,如下所示:

FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

答案 1 :(得分:1)

在Oracle文档中找到答案:

  

session.invalidate()方法,通常用于注销   user,仅使用户的当前会话无效 - 用户   身份验证信息仍然有效并存储在   服务器或虚拟主机的上下文。如果是服务器或虚拟主机   只托管一个Web应用程序,session.invalidate()方法,   实际上,注销用户。

http://docs.oracle.com/cd/E11035_01/wls100/webapp/sessions.html#wp150374