方法一
/**
* @功能描述: 单用户登录,清除当前用户以前登录时保存的session会话
* @param loginName
*/
public void singleUseLogin(String loginName){
// 1.获取当前用户sessionId
String currentUserSessionId = SecurityUtils.getSubject().getSession().getId().toString();
// 2.获取shiro的sessionManager
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
// 3.获取所有已登录用户的session列表
Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
User user = null;
if (sessions.size() > 1) {
System.out.println("仅允许单用户登录,开始清理遗留用户信息~");
for(Session onlineSession:sessions){
// 4. 获取已登录用户的session的key值
SimplePrincipalCollection simplePrincipalCollection = (SimplePrincipalCollection) onlineSession.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
// 5. 获取new SimpleAuthenticationInfo(user, pwd, this.getName())中放进去的第一个参数
user = (User) simplePrincipalCollection.getPrimaryPrincipal();
// 6. 清除当前用户以前登录时保存的session会话
if (loginName.equals(user.getUserName()) && !onlineSession.getId().equals(currentUserSessionId)) {
sessionManager.getSessionDAO().delete(onlineSession);
System.out.println("清理用户["+loginName+"],SessionId为["+onlineSession.getId()+"]的Session信息!");
}
}
} else {
System.out.println("无可清理用户信息~");
}
}
方法二,优化版
/**
* @功能描述: 单用户登录,清除当前用户以前登录时保存的session会话
* @param loginName
*/
public void singleUseLogin(String loginName){
// 1.获取当前用户sessionId
String currentUserSessionId = SecurityUtils.getSubject().getSession().getId().toString();
// 2.获取当前用户
User user = (User) SecurityUtils.getSubject().getPrincipal();
// 3.获取shiro的sessionManager
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
// 4.获取所有已登录用户的session列表
Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
if (sessions.size() > 1) {
System.out.println("仅允许单用户登录,开始清理遗留用户信息~");
for(Session onlineSession:sessions){
// 5. 清除当前用户以前登录时保存的session会话
if (loginName.equals(user.getUserName()) && !onlineSession.getId().equals(currentUserSessionId)) {
sessionManager.getSessionDAO().delete(onlineSession);
System.out.println("清理用户["+loginName+"],SessionId为["+onlineSession.getId()+"]的Session信息!");
}
}
} else {
System.out.println("无可清理用户信息~");
}
}
转载于:https://blog.51cto.com/1197822/2324201