【发布时间】:2012-05-24 18:47:42
【问题描述】:
我们需要从某种管理面板中终止特定会话(按会话 ID)的功能。
我尝试使用以下方法:
public static void killSession(String sid) {
HttpSessionContext sc = FacesUtil.getSession().getSessionContext();
HttpSession session=sc.getSession(sid);
session.invalidate();
}
然而
- HttpSessionContext 和 getSessionContext() 和 会话的 getSession(sessionId) 方法都已弃用(出于看似偏执的安全原因)
- 上面的代码在 ApplicationScoped JSF 托管 bean 中调用时也会得到一个空会话
我正在寻找实现该功能的替代方法。
【问题讨论】:
-
如何发送额外的 GET/POST 请求并设置所需值的
JSESSIONIDcookie 到使当前会话无效的 HttpServlet? -
@Dmytro,感谢您的建议。我已经认为这是最后的手段。作为最佳实践,我在 JSF 中寻找了一种方法来实现这一点。作为最后的手段,我会尝试这样做,但从 Java EE 5 开始,从另一个会话中使会话无效的方法似乎已被弃用,并且可能无法实现。
-
当调用使 servlet 无效的 doPost/doGet 方法时,其上下文中的当前会话 ID 将具有您之前在
JSESSIONIDcookie 中指定的值。因此,您的 servlet 使所需的指定会话无效。 :) -
@Dmytro 你能提供一个示例代码片段来展示你的建议吗?如果您将其作为答案发布并且有效,我肯定会接受答案并至少投票 +1
-
如果您也在数据库中跟踪登录用户,最好在数据库中设置一个布尔值,然后在每个请求上检查它。这样,它也可以在分布式系统上正常工作,并且当会话在请求中失效时不会导致意外(异常)。
标签: java session jsf sessionid