网站建设咨询有客诚信wordpress手机全部显示
news/
2025/9/26 0:26:12/
文章来源:
网站建设咨询有客诚信,wordpress手机全部显示,凡科网络,霞浦县建设局网站在Shiro中我们可以通过org.apache.shiro.session.mgt.eis.SessionDAO对象的getActiveSessions()方法方便的获取到当前所有有效的Session对象。通过这些Session对象#xff0c;我们可以实现一些比较有趣的功能#xff0c;比如查看当前系统的在线人数#xff0c;查看这些在线用…在Shiro中我们可以通过org.apache.shiro.session.mgt.eis.SessionDAO对象的getActiveSessions()方法方便的获取到当前所有有效的Session对象。通过这些Session对象我们可以实现一些比较有趣的功能比如查看当前系统的在线人数查看这些在线用户的一些基本信息强制让某个用户下线等。我们在现有的Spring Boot Shiro项目基础上进行一些改造。Redis Session管理Redis作为缓存实现那么SessionDAO为RedisSessionDAO/*** session会话** return*/Beanpublic RedisSessionDAO sessionDAO() {RedisSessionDAO redisSessionDAO new RedisSessionDAO();redisSessionDAO.setRedisManager(redisManager());return redisSessionDAO;}Ehcache Session管理Ehcache作为缓存实现那么SessionDAO为RedisSessionDAO/*** session会话** return*/Beanpublic SessionDAO sessionDAO() {MemorySessionDAO sessionDAO new MemorySessionDAO();return sessionDAO;}SessionManager 管理器SessionDao通过org.apache.shiro.session.mgt.SessionManager进行管理在ShiroConfig中配置SessionManager/*** session会话管理器*/Beanpublic SessionManager sessionManager() {DefaultWebSessionManager sessionManager new DefaultWebSessionManager();Collection listeners new ArrayList();listeners.add(new ShiroSessionListener());sessionManager.setSessionListeners(listeners);sessionManager.setSessionDAO(sessionDAO());return sessionManager;}ShiroSessionListener 监听器public class ShiroSessionListener implements SessionListener{private final AtomicInteger sessionCount new AtomicInteger(0);Overridepublic void onStart(Session session) {sessionCount.incrementAndGet();}Overridepublic void onStop(Session session) {sessionCount.decrementAndGet();}Overridepublic void onExpiration(Session session) {sessionCount.decrementAndGet();}}ShiroSessionListener维护着一个原子类型的Integer对象用于统计在线Session的数量。定义完SessionManager后还需将其注入到SecurityManager中Beanpublic SecurityManager securityManager(){DefaultWebSecurityManager securityManager new DefaultWebSecurityManager();securityManager.setRealm(shiroRealm());...securityManager.setSessionManager(sessionManager());return securityManager;}UserOnline配置完ShiroConfig后我们可以创建一个UserOnline实体类用于描述每个在线用户的基本信息public class UserOnline implements Serializable{private static final long serialVersionUID 3828664348416633856L;// session idprivate String id;// 用户idprivate String userId;// 用户名称private String username;// 用户主机地址private String host;// 用户登录时系统IPprivate String systemHost;// 状态private String status;// session创建时间private Date startTimestamp;// session最后访问时间private Date lastAccessTime;// 超时时间private Long timeout;// get set略}Service创建一个Service接口包含查看所有在线用户和根据SessionId踢出用户抽象方法public interface SessionService {List list();boolean forceLogout(String sessionId);}其具体实现Servicepublic class SessionServiceImpl implements SessionService {Autowiredprivate SessionDAO sessionDAO;Overridepublic List list() {List list new ArrayList();Collection sessions sessionDAO.getActiveSessions();for (Session session : sessions) {UserOnline userOnline new UserOnline();TbUser user;SimplePrincipalCollection principalCollection;if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) null) {continue;} else {principalCollection (SimplePrincipalCollection) session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);user (TbUser) principalCollection.getPrimaryPrincipal();userOnline.setUsername(user.getUserName());userOnline.setUserId(user.getId().toString());}userOnline.setId((String) session.getId());userOnline.setHost(session.getHost());userOnline.setStartTimestamp(session.getStartTimestamp());userOnline.setLastAccessTime(session.getLastAccessTime());Long timeout session.getTimeout();if (timeout 0L) {userOnline.setStatus(离线);} else {userOnline.setStatus(在线);}userOnline.setTimeout(timeout);list.add(userOnline);}return list;}Overridepublic boolean forceLogout(String sessionId) {Session session sessionDAO.readSession(sessionId);session.setTimeout(0);return true;}}通过SessionDao的getActiveSessions()方法我们可以获取所有有效的Session通过该Session我们还可以获取到当前用户的Principal信息。值得说明的是当某个用户被踢出后(Session Time置为0)该Session并不会立刻从ActiveSessions中剔除所以我们可以通过其timeout信息来判断该用户在线与否。如果使用的Redis作为缓存实现那么forceLogout()方法需要稍作修改Overridepublic boolean forceLogout(String sessionId) {Session session sessionDAO.readSession(sessionId);sessionDAO.delete(session);return true;}Controller定义一个SessionContoller用于处理Session的相关操作ControllerRequestMapping(/online)public class SessionController {AutowiredSessionService sessionService;RequestMapping(/index)public String online() {return online;}ResponseBodyRequestMapping(/list)public List list() {return sessionService.list();}ResponseBodyRequestMapping(/forceLogout)public AjaxResult forceLogout(String id) {try {sessionService.forceLogout(id);return AjaxResult.success();} catch (Exception e) {e.printStackTrace();return AjaxResult.error(踢出用户失败);}}}页面我们编写一个online.html页面用于展示所有在线用户的信息在线用户管理table {margin: 20px 40px 20px 0px;width: 100%;border-collapse: collapse;border-spacing: 0;table-layout: automatic;word-wrap: break-all}table tbody tr:nth-of-type(odd) {background-color: #F7F7F7}th, td {padding: 8px;text-align: left;vertical-align: middle;font-weight: normal;font-size: 12px;border-bottom: 1px solid #fff;}th {padding-bottom: 10px;color: #fff;font-weight: 700;background: rgba(66, 185, 131, .9)}td {border-bottom-width: 1px}在线用户数序号用户名称登录时间最后访问时间主机状态操作返回var ctx [[{/}]];$.get(ctx online/list, {}, function (r) {console.log(r);var length r.length;$(#onlineCount).text(length);var html ;for (var i 0; i length; i) {html (i 1) r[i].username r[i].startTimestamp r[i].lastAccessTime r[i].host r[i].status 下线 ;}$(table).append(html);}, json);function offline(id, status) {if (status 离线) {alert(该用户已是离线状态);return;}$.get(ctx online/forceLogout, {id: id}, function (r) {if (r.code 0) {alert(该用户已强制下线);location.href ctx online/index;} else {alert(r.msg);}}, json);}在index.html中加入该页面的入口xmlns:thhttp://www.thymeleaf.orgxmlns:shirohttp://www.pollix.at/thymeleaf/shiro首页div {border: 1px dashed #ddd;padding: 10px;margin: 10px 10px 10px 0px;}你好[[${user.userName}]]你的角色为超级管理员你的角色为测试账户获取用户信息新增用户删除用户在线用户管理注销测试在主界面点击“在线用户管理”下线按钮成功将其强制踢出
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917722.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!