在我的应用程序中,我有一个可以删除用户的管理员。所以当我从管理会话中删除一个用户时,我希望被删除的用户应该自动注销。我知道我删除的用户的会话 ID,但我不知道如何使用会话 ID 使会话无效。
我想要类似的东西:invalidate(SessionId);
有没有可能?我认为可以使用过滤器并在每次请求时检查数据库,但是还有另一种方法我不需要在每个 httprequest 上检查数据库吗?
谢谢。:D
在我的应用程序中,我有一个可以删除用户的管理员。所以当我从管理会话中删除一个用户时,我希望被删除的用户应该自动注销。我知道我删除的用户的会话 ID,但我不知道如何使用会话 ID 使会话无效。
我想要类似的东西:invalidate(SessionId);
有没有可能?我认为可以使用过滤器并在每次请求时检查数据库,但是还有另一种方法我不需要在每个 httprequest 上检查数据库吗?
谢谢。:D
我想我看到了一个使用 Spring Security 基础设施和SessionRegistry类的解决方案。
您必须在HttpSessionEventPublisher
以下位置注册web.xml
:
<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对它的工作原理有一些解释。
让我们知道这是否有帮助。
// to end a session of a user:
List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(user, false);
sessionRegistryImpl.getSessionInformation(sessions.get(0).getSessionId()).expireNow();
// note: you can get all users and their corresponding session Ids:
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());
}
除了如上所述使用户过期之外,您可能还希望将它们从注册表中删除:
// expire and remove the user's sessions from Spring session registry
List<Object> principals = sessionRegistry.getAllPrincipals();
for (Object principal : principals) {
List<SessionInformation> sessions = sessionRegistry.getAllSessions(principal, true);
for (SessionInformation sessionInfo : sessions) {
if (authentication.getPrincipal().equals(sessionInfo.getPrincipal())) {
if (!sessionInfo.isExpired()) sessionInfo.expireNow();
sessionRegistry.removeSessionInformation(sessionInfo.getSessionId());
}
}
}
如果使用 xml 配置来连接你的 Spring Session Registry,它可能看起来像这样:
<beans:bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
除了@LaurentG 的建议外,还需要在您的 spring 配置文件中添加以下内容:
<session-management>
<concurrency-control session-registry-alias="sessionRegistry" />
</session-management>
让它工作。@zygimantus answer 也可用于访问会话数据。