在我的应用程序中,我有一个管理员可以删除用户。所以当我从管理员会话中删除一个用户时,我希望被删除的用户可以自动注销。
我知道我要删除的用户的会话ID,但是我不知道如何使用会话ID使会话失效。
我想要的是:invalidate(SessionId);
有没有可能以任何方式实现这个?我觉得可以使用一个过滤器,并且在每次请求时检查数据库,但是还有没有其他的方式,在每个HTTP请求中都不需要检查数据库?
谢谢。:D
在我的应用程序中,我有一个管理员可以删除用户。所以当我从管理员会话中删除一个用户时,我希望被删除的用户可以自动注销。
我知道我要删除的用户的会话ID,但是我不知道如何使用会话ID使会话失效。
我想要的是:invalidate(SessionId);
有没有可能以任何方式实现这个?我觉得可以使用一个过滤器,并且在每次请求时检查数据库,但是还有没有其他的方式,在每个HTTP请求中都不需要检查数据库?
谢谢。:D
// 结束用户会话:
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());
}
根据@LaurentG的建议,需要在您的spring配置文件中添加以下内容:
<session-management>
<concurrency-control session-registry-alias="sessionRegistry" />
</session-management>
以使其正常工作。此外,可以使用@zygimantus的答案来访问会话数据。
我认为可以使用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中有一些解释。如果有帮助,请告诉我们。