在Spring中销毁另一个用户的会话

IT小君   2023-10-24T23:17:03

在我的应用程序中,我有一个管理员可以删除用户。所以当我从管理员会话中删除一个用户时,我希望被删除的用户可以自动注销。

我知道我要删除的用户的会话ID,但是我不知道如何使用会话ID使会话失效。

我想要的是:invalidate(SessionId);

有没有可能以任何方式实现这个?我觉得可以使用一个过滤器,并且在每次请求时检查数据库,但是还有没有其他的方式,在每个HTTP请求中都不需要检查数据库?

谢谢。:D

评论(4)
IT小君

我认为可以使用Spring Security基础设施来解决,其中使用到了SessionRegistry类。

你需要在web.xml中注册HttpSessionEventPublisher

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

在Spring配置文件中声明SessionRegistry:

<bean id="sessionRegistry"
     class="org.springframework.security.core.session.SessionRegistryImpl" />

在管理控制台中,你需要使用SessionRegistry来获取用户的SessionInformation并调用expireNow。在用户的下一个请求中,一个servlet过滤器应该使HttpSession过期。关于它的工作原理,SessionInformation的javadoc中有一些解释。

如果有帮助,请告诉我们。

2023-10-24T23:17:49   回复
IT小君
// 结束用户会话:
List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false);
sessionRegistryImpl.getSessionInformation(sessions.get(0).getSessionId()).expireNow();

// 注意:您可以获取所有用户及其对应的会话ID:
List<Object> users = sessionRegistryImpl.getAllPrincipals();
List<String> sessionIds = new ArrayList<>(users.size());

for (Object user: users) {
    List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false);
    sessionIds.add(sessions.get(0).getSessionId());
}
2023-10-24T23:18:03   回复
IT小君

根据@LaurentG的建议,需要在您的spring配置文件中添加以下内容:

<session-management>
    <concurrency-control session-registry-alias="sessionRegistry" />
</session-management>

以使其正常工作。此外,可以使用@zygimantus的答案来访问会话数据。

2023-10-24T23:18:36   回复