【问题标题】:How to manually kill a specific HttpSession by ID如何通过 ID 手动杀死特定的 HttpSession
【发布时间】: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();
}

然而

  1. HttpSessionContext 和 getSessionContext() 和 会话的 getSession(sessionId) 方法都已弃用(出于看似偏执的安全原因)
  2. 上面的代码在 ApplicationScoped JSF 托管 bean 中调用时也会得到一个空会话

我正在寻找实现该功能的替代方法。

【问题讨论】:

  • 如何发送额外的 GET/POST 请求并设置所需值的 JSESSIONID cookie 到使当前会话无效的 HttpServlet?
  • @Dmytro,感谢您的建议。我已经认为这是最后的手段。作为最佳实践,我在 JSF 中寻找了一种方法来实现这一点。作为最后的手段,我会尝试这样做,但从 Java EE 5 开始,从另一个会话中使会话无效的方法似乎已被弃用,并且可能无法实现。
  • 当调用使 servlet 无效的 doPost/doGet 方法时,其上下文中的当前会话 ID 将具有您之前在 JSESSIONID cookie 中指定的值。因此,您的 servlet 使所需的指定会话无效。 :)
  • @Dmytro 你能提供一个示例代码片段来展示你的建议吗?如果您将其作为答案发布并且有效,我肯定会接受答案并至少投票 +1
  • 如果您也在数据库中跟踪登录用户,最好在数据库中设置一个布尔值,然后在每个请求上检查它。这样,它也可以在分布式系统上正常工作,并且当会话在请求中失效时不会导致意外(异常)。

标签: java session jsf sessionid


【解决方案1】:

是的,出于安全原因,您不能使另一个sessionsession 无效。您可以做的是手动将所有sessions 存储在一些可供管理员使用的static attribute 中。因此,用户登录,您将他和他的session 添加到此属性(通常是Map/HashMap,用户为keysessionvalue)。

看看我之前的回答here,你就会明白了。

【讨论】:

  • 感谢您的回答,我已经在应用程序范围的托管 bean 中为每个连接的用户及其会话 ID 存储了一些信息 - 这已经用于获取所有活动的只读视图与已连接用户的会话。
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多