【问题标题】:Can I expire all sessions of a user?我可以使用户的所有会话过期吗?
【发布时间】:2013-05-08 09:28:46
【问题描述】:

我可以使用户的所有会话过期吗?
我知道我可以使用session.invalidate() 使session 过期。

我正在使用 Tomcat、servlet/JSP。

在会话中我有一个属性userId

在此基础上,我们定义此session 属于特定用户。

我需要使包含特定 userId 的所有会话无效。

【问题讨论】:

  • 您可以创建一个HttpSessionListener 并将每个创建的会话添加到一些List 并放入context。然后遍历List 以获取每个session 检查其属性和invalidate() !!!!
  • 您可以将所有会话值设为空..

标签: java session jakarta-ee tomcat servlets


【解决方案1】:

通过实现HttpSessionListener 来创建一个监听器,并将每个创建的会话添加到一个数据结构中。 .比如地图或列表

对于 Map,使用 SessionId as Keysession object 作为值。 . . .

同时覆盖 sessionCreated(HttpSessionEvent event)sessionDestroyed(HttpSessionEvent event)

sessionCreated(HttpSessionEvent event) 方法在容器创建任何会话时调用。 .我们可以在这个创造时间做任何我们想做的事情。 .比如添加列表或地图

sessionDestroyed(HttpSessionEvent event) 在会话被销毁或无效(通过代码或服务器超时)时调用。 .我们可以在销毁之前用它做任何事情。 . .像总记录时间。 .从列表或地图中删除。 .等等

【讨论】:

    【解决方案2】:

    您可以将所有会话值设为空..

    session.removeAttribute("userId");
    

    【讨论】:

      【解决方案3】:

      使用this code 管理您的活动会话并通过其 Id 获取会话,然后您可以调用此会话并在需要时使其无效:

       public class SessionListener implements HttpSessionListener  
      {  
      
           private static Map<String, HttpSession> map = new   
                                           HashMap<String, HttpSession>();  
      
          public void sessionCreated(HttpSessionEvent event)  
          {  
              String id = event.getSession().getId();  
              logger.debug("session created : " + id);  
              // STORE THE SESSOIN FOR EXAMPLE IN DATABASE 
              map.put(id, event.getSession());  
          }  
      
          public static HttpSession getHttpSession(String sessionID)  
          {  
              return sessionObjectMap.get(sessionID);  
          }  
      
          public void sessionDestroyed(HttpSessionEvent event)  
          {  
              // get the destroying session...               
          }  
      } 
      

      【讨论】:

      • 好答案投票。 . .sessionDestroyed() 是超载的,每次我们销毁会话时都会调用它。 .只有当我们想要销毁所有会话时我们才能重载它
      • 在HttpSessionListener接口中,你必须实现它,至少声明。
      • 代码不是线程安全的,因为 HashMap 不是线程安全的类。此外,“地图”永远不会被清除,因此会话将永远留在内存中,从而导致内存泄漏。
      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2017-06-07
      • 2019-10-31
      • 1970-01-01
      相关资源
      最近更新 更多