登录用户互挤 实现的思路
有许多应用会有这样的一个需求,一个用户登录了,另一个用户用了同样的账号密码登录,要把第一个登录的用户挤下线,在这里简单说一下实现的思路:主要是通过fiter来实现,看代码和注释:代码使用了shiro session 管理,所以比较好实现 ,就是给当前的session 添加一个标识
LoginFilter
/* 根据SHA256用户名 获取Session */String userKey = String sessionId = StringUtils.trim(session.getId().toString());String kickoutSessionId = StringUtils.trim(redisClientTemplate.get(userKey));//如果不为空且不与当前session相同,则设置前一个人的session为踢出if (kickoutSessionId != null && !StringUtils.equals(kickoutSessionId, sessionId)) {try {Session kickoutSession = shiroSessionManager.getSession(new DefaultSessionKey(kickoutSessionId));if (kickoutSession != null) {//设置会话的kickout属性表示踢出了kickoutSession.setAttribute("kickout", true);}} catch (UnknownSessionException unknownSessionException) {//因为经常会遇到此种情况且无正规解决方案,为减少线上无用日志这里采用debug级别打印。logger.debug("sessionID为" + kickoutSessionId + "的session不存在", unknownSessionException);} catch (Exception e) {//ignore exceptionlogger.error("设置session踢出标志失败", e);} finally {/* 设置用户当前登录的sessionId */redisClientTemplate.setEx(userKey, ShiroConstant.DEFAULT_CACHE_EXPIRE, sessionId);}} else if (kickoutSessionId == null) {//短期内无登录记录/* 设置用户当前登录的sessionId */redisClientTemplate.setEx(userKey, ShiroConstant.DEFAULT_CACHE_EXPIRE, sessionId);}
KickoutFilter
/* 判断用户是否已登录 */Subject subject = getSubject(request, response);if (!subject.isAuthenticated() && !subject.isRemembered()) {//如果没有登录,直接进行之后的流程return true;}/* 获取用户名及sessionId */Session session = subject.getSession();String sessionId = StringUtils.trim(session.getId().toString());/* 获取session如果过内有kickout 如果被踢出了,直接退出,重定向到踢出后的地址*/if (session.getAttribute("kickout") != null) {try {subject.logout();//会话被踢出了,执行退出操作} catch (Exception e) { //ignorelogger.error("账号登出失败", e);}
登录用户互挤 实现的思路相关推荐
- java_后端获取当前登录用户信息
后端获取当前登录用户信息 开发过程中,发现有很多地方需要获取当前登录的用户信息,比如新增.修改时候要记录创建人和更新人信息,如果每次操作都从数据库中获取用户信息,会增加不必要的开销,同时也增加数据库的 ...
- 单用户登录记录互踢下线思路
单用户登录记录(只谈redis实现) 用户登录成功生成随机值(uuid或者雪花算法,随意)存在redis(假设key="token-user:token",值="user ...
- java 用户登录模块_Java SSH框架系列:用户登录模块的设计与实现思路
1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于 ...
- 【Spring Security】如何实现多设备同一时间只允许一个账号登录(即前登录用户被后登录用户挤下线)?只需简单两步!
1.需求分析 在同一个系统中,我们可能只允许一个用户在一个终端上登录,一般来说这可能是出于安全方面的考虑,但是也有一些情况是出于业务上的考虑,需求就是业务原因要求一个用户只能在一个设备上登录. 要实现 ...
- java登陆挤下去代码_application作用域实现用户登录挤掉之前登录用户代码
一.实现思想 1.application(servletcontext)是保存在服务器端的作用域,我们在application中保存两种形式的键值对:1:,2: 2.每当一个用户登录时(将生成一个新的 ...
- Spring微服务间登录用户信息共享思路
微服务之间使用feign的RequestInterceptor拦截器实现请求头传递当前登录用户信息:各线程中使用ThreadLocal存储数据:使用SpringAOP 在Controller类的方法增 ...
- SharePoint里如何设置People picker值为当前登录用户值
摘要: 相信很多朋友都遇到过需要将某个People类型的字段值设置为当前登录用户的情况而且已经给出了解决方案,因此本文没有什么新意,算法上也比较冗余,仅仅在博客里算作知识的备份. 思路: 在画面的右上 ...
- linux用户自动输入密码,Linux自动输入密码登录用户
每次进去Linux系统,都有切换root用户,输入密码很麻烦,所以就写了一个小脚本,自动输入密码,登录到root用户, 1,首先检查一些是否安装了expect root@wuzs:/home/wuzs ...
- Spring Security登录用户数据获取(4)
1. 登录用户数据获取 登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从 ...
最新文章
- UNIX--stat、fstat和lstat函数
- 阅读器关闭时Read的尝试无效
- Mysql字段类型选择
- Objective-C中的NSNumber和NSString
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲
- mysql 键 索引_五、MySQL索引和键
- android 如何发送短信,如何在android中发送短信
- 阿里云服务器最新价格表(标准收费报价表)
- android银联支付
- 和风天气更新数据失败原因分析
- Java8新特性(二)流式处理
- python数据分析经典书籍有哪些_数据分析有哪些好书值得推荐?
- 微信小程序实现列表页的点赞和取消点赞功能!
- C# 中的委托和事件[转自张子扬]
- 个人计算机也可以做为服务器,普通个人电脑可以充当电脑服务器来使用吗
- Flag壁纸生成器诞生记
- 满城尽带黄金甲的二三事
- 2022下半年火爆互联网商业模式揭晓,乐分享如何超强吸粉?详解
- 【Python学习教程】Python编程环境搭建
- python自动刷抖音视频_python+adb实现自动刷抖音视频