2013-05-14 49 views
3

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

我正在使用Tomcat,servlet/JSP。

在会议中我有一个属性userId

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

我有一种需要,我必须使包含特定userId的所有会话无效。

+5

您可以创建一个'HttpSessionListener',并将每个创建的会话添加到某个'List'并放入'context'中。然后遍历'List'来获得每个'session'检查它的属性和'invalidate()'! – NINCOMPOOP 2013-05-14 07:33:37

+0

您可以使所有会话值为空。 – 2013-05-14 07:50:20

回答

6

使用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...    
    } 
} 
+0

好答案voteedup。 。 .sessionDestroyed()在每次我们销毁会话时都会加载并调用。 。只有当我们想销毁所有会话时,我们才可以重载它 – 2013-05-14 07:56:48

+0

它在HttpSessionListener接口中,您必须实现它,至少是声明。 – CloudyMarble 2013-05-14 07:59:07

+1

由于HashMap不是线程安全的类,因此该代码不是线程安全的。 此外,“地图”永远不会被清除,因此会话将永远留在内存中,导致内存泄漏。 – 2015-07-27 18:22:07

0

您可以清空所有会话值..

session.removeAttribute("userId"); 
+3

这不是OP想要的东西!!!! – NINCOMPOOP 2013-05-14 07:54:58

1

通过执行HttpSessionListener来创建列表器,并将每个创建的会话添加到数据结构中。 。如地图或列表

对于地图使用SessionId as Keysession object作为值。 。 。 。当通过容器创建的任何会话

覆盖既sessionCreated(HttpSessionEvent event)sessionDestroyed(HttpSessionEvent event)

sessionCreated(HttpSessionEvent event)方法被调用。 。我们可以在这个创作时间做我们想做的事情。 。像添加列表或地图

sessionDestroyed(HttpSessionEvent event)当会话被破坏或无效(通过代码或服务器超时)时被调用。 。我们可以在破坏之前做任何事情。 。 。比如总记录时间。 。从列表或地图中删除。 。 etc

相关问题