请像对待每一行代码一样对待每篇文章 —- 鹰嘴豆
学习目标
开始学习
- 如何用Shiro实现在线用户管理功能
Shiro进行在线用户管理的时候,根据下面代码获取所有的在线用户并通过在线用户的Id找到其他关联表的一些信息并使用内存分页的形式返回页面展示所有登陆者的信息
还需要一个踢出用户的功能。根据前端传递的踢出用户的id去遍历比对所有在线用户的session,找到这个session以后通过session.stop去终止这个用户的会话且通过用户的id找到websocket的会话通道发送踢出时的信息提示。这样做有问题吗?经过实践发现session.stop终止这个用户会话以后使用sessionManager.getSessionDAO().getAtiveSessions()还会查到已经session.stop的session,这点非常的困惑,查看了session.stop的注解有下面几段话:// 根据Shiro获取所有的Session
Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
// 循环把session包装成一个Subject对象并且获取登录时存放在session中的用户对象返回相关映射集合
Subject sessionSubject = new Subject.Builder().session(session).buildSubject();
CmsUserEntity user = (CmsUserEntity) sessionSubject.getPrincipal();
mapSession.put(user.getId(), session);
As such, you might consider logging-out the ‘owning’ Subject instead of manually calling this method, as a log out is expected to stop the corresponding session automatically, and also allows framework code to execute additional cleanup logic.
因此在踢出用户调用session.stop停止会话的时候用Shiro的Subject.logout代替,那么我如何获取被踢session的Subject呢?其实Shiro提供了我们一个包装的方法,请看下面代码
// 清除会话,session.stop清除资源不够彻底还能被getAtiveSessions拿到停止的session
Subject subject = new Subject.Builder().session(session).buildSubject();
subject.logout();
学习总结
贡献者列表
编辑人 | 编辑时间 | 编辑内容 |
---|---|---|