【问题标题】:Why shouldn't I destroy http session on user logout?为什么我不应该在用户注销时销毁 http 会话?
【发布时间】:2014-10-22 19:04:33
【问题描述】:

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

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

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

【问题讨论】:

  • 好吧,用户通过会话 bean 进行身份验证。没什么大不了的:它在成功验证时保存用户名。对我来说,问题是您可能会在取消身份验证后不小心将用户相关数据留在会话中,在其他会话 bean 中(不是我能想到一个很好的例子,因为我没有任何会话范围的输入表单(并且可能不应该)没有,这就是我猜的视图范围)或类似的东西。该应用程序处于早期开发阶段......)。

标签: jsf session authentication javabeans invalidation


【解决方案1】:

你必须同时做这两件事。取消对用户的身份验证可能取决于您的实施。如果您调用第三方系统为用户获取安全令牌,您可能必须再次调用以使令牌无效。

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

顺便说一句,您可以使会话无效,而无需获取 HttpSession,如下所示:

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

【讨论】:

    【解决方案2】:

    在 Oracle 文档中找到答案:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多