shiro的使用详情

http://m.blog.youkuaiyun.com/dreamer_8399/article/details/77523092
Shiro中实现踢出用户的方式有多种,其中一种比较常见的方式是使用Session Manager的`SessionListener`接口来监听会话的创建和注销事件,并在事件触发时进行处理。 具体实现可以参考以下步骤: 1. 创建一个类实现`SessionListener`接口,并实现`onStart`和`onStop`方法,分别用于处理会话创建和注销事件,例如: ``` public class KickoutSessionListener implements SessionListener { @Override public void onStart(Session session) { // 会话创建时调用 } @Override public void onStop(Session session) { // 会话注销时调用 } } ``` 2. 在Shiro配置文件中配置Session Manager,并将上一步创建的Session Listener添加到其中,例如: ``` <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionListeners"> <list> <bean class="com.example.KickoutSessionListener"/> </list> </property> </bean> ``` 3. 在`onStart`方法中将用户的会话添加到一个Set中,用于记录当前在线的用户会话,例如: ``` @Override public void onStart(Session session) { // 获取当前登录的用户信息 Object principal = SecurityUtils.getSubject().getPrincipal(); if (principal != null) { // 将用户会话添加到在线用户列表中 String username = ((User) principal).getUsername(); Set<Session> sessions = kickoutSessionService.getSessionsByUsername(username); if (sessions == null) { sessions = new HashSet<>(); kickoutSessionService.setSessionsByUsername(username, sessions); } sessions.add(session); } } ``` 4. 在`onStop`方法中将用户的会话从在线用户列表中移除,并判断是否需要踢出用户,例如: ``` @Override public void onStop(Session session) { // 获取当前登录的用户信息 Object principal = SecurityUtils.getSubject().getPrincipal(); if (principal != null) { String username = ((User) principal).getUsername(); Set<Session> sessions = kickoutSessionService.getSessionsByUsername(username); if (sessions != null) { // 移除用户会话 sessions.remove(session); // 如果当前用户的会话数超过了最大会话数,则踢出用户 if (sessions.size() > maxSessionCount) { kickoutSessionService.kickout(username); } } } } ``` 其中,`kickoutSessionService`是一个自定义的服务类,用于管理在线用户列表和踢出用户。`maxSessionCount`是一个配置的最大会话数,用于控制用户的登录终端数量。在`kickout`方法中可以实现踢出用户的逻辑,例如: ``` public void kickout(String username) { // 获取当前用户的所有会话 Set<Session> sessions = sessionsByUsername.get(username); if (sessions != null) { // 遍历所有会话,将其踢出 for (Session session : sessions) { try { session.stop(); } catch (Exception e) { // 异常处理 } } // 从在线用户列表中移除该用户的所有会话 sessionsByUsername.remove(username); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值