2013-02-07 57 views
18

我希望能够以编程方式注销所有登录的用户。如何强制在某些事件上注销所有用户?如何在spring-security中注销所有登录的用户?

+0

答案描述了如何获取有关活动会话的信息,但没有描述如何使它们失效。 – gstackoverflow

+0

@gstackoverflow - 回答说在活动会话中调用'expireNow()'以导致注销。你在找别的东西吗? –

+0

@Neil Smithline回答沉默关于如何得到这个会议。因此答案是不完整的,因此不被作者接受 – gstackoverflow

回答

18

首先定义HttpSessionEventPublisher在web.xml

<listener> 
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 

然后在你的春天security.xml文件中定义<session-management>

现在,在您的控制器方法中使用SessionRegistry来使所有会话失效。以下代码检索所有活动会话。

List<SessionInformation> activeSessions = new ArrayList<SessionInformation>(); 
    for (Object principal : sessionRegistry.getAllPrincipals()) { 
     for (SessionInformation session : sessionRegistry.getAllSessions(principal, false)) { 
      activeSessions.add(session); 
     } 
    } 

在每个活动的会话,你可以调用expireNow()法到期或使它们无效。

+0

@Maksym Demidas我怎样才能得到** Session ** ** SessionInformation **? – gstackoverflow

+0

Answer描述了如何仅获取有关活动会话的信息,但没有描述如何使它们失效。 – gstackoverflow

+0

@gstackoverflow在Servlet API中没有办法通过SessionInformation获取会话(并且有一个很好的理由 - 这不是安全的操作)。如果你真的需要它,你可以尝试手动做一个解决方法([这样的事情])(http://stackoverflow.com/questions/3092363/how-can-i-load-java-httpsession-from-jsessionid/3092495# 3092495)) –

0

Ketan为您提供了您正在寻找的答案,如果您更改了第二个块并使用session.expireNow();而不是activeSessions.add(session);,则最终所有活动会话都会过期。

+0

在哪里可以找到会话? – gstackoverflow

+0

如果您仔细阅读了Ketan的示例代码,您会发现'session'是从'sessionRegistry.getAllSessions'方法获得的。 – malaguna

+0

请注意,并仔细查看退货类型 – gstackoverflow

相关问题