【发布时间】:2016-11-06 22:42:07
【问题描述】:
在春季安全:
我认为使用两种方式注销:发生会话超时或用户注销本身时...
无论如何,以这些方式,在HttpSessionEventPublisher 和SessionRegistry 中调用destroySession,从sessionIds 列表中删除SessionInformation...
当我使用以下方法强制注销特定用户时,此方法只是在 SessionRegistry 中“过期”SessionInformation。现在,当我从SessionRegistry 获取所有在线用户“getAllPrincipals()”时,会话过期的用户在列表中!
@Override
public boolean forceLogOut(int userId){
for (Object username: sessionRegistry.getAllPrincipals()) {
User temp = (User) username;
if(temp.getId().equals(userId)){
for (SessionInformation session : sessionRegistry.getAllSessions(username, false)) {
session.expireNow();
}
}
}
return true;
}
如何从“Web 服务器”和“会话注册表”中注销会话对象的“特定用户”或“会话 ID”?
我在谷歌上搜索并在 Servlet API 中找到了HttpSessionContext,它可以从特定的 sessionId 获取 HttpSession。然后使会话无效。但我认为这种方法并不完全有用!
(注意。这个类已被弃用!)
什么是最好的方法?是不是我错了?
【问题讨论】:
-
sessionRegistry.getSessionInformation(sessionId).expireNow(); Spring 会将这个会话标记为过期。此会话的任何进一步请求都将调用注销。
-
这是真的,但是如果用户不发送任何请求并且会话超时最大超过 1 小时(超时不触发),那么,当使用
getAllPrincipals()时,此方法返回所有原则包括在线会话和过期会话...这是我的问题...!