有许多应用会有这样的一个需求,一个用户登录了,另一个用户用了同样的账号密码登录,要把第一个登录的用户挤下线,在这里简单说一下实现的思路:主要是通过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);}

登录用户互挤 实现的思路相关推荐

  1. java_后端获取当前登录用户信息

    后端获取当前登录用户信息 开发过程中,发现有很多地方需要获取当前登录的用户信息,比如新增.修改时候要记录创建人和更新人信息,如果每次操作都从数据库中获取用户信息,会增加不必要的开销,同时也增加数据库的 ...

  2. 单用户登录记录互踢下线思路

    单用户登录记录(只谈redis实现) 用户登录成功生成随机值(uuid或者雪花算法,随意)存在redis(假设key="token-user:token",值="user ...

  3. java 用户登录模块_Java SSH框架系列:用户登录模块的设计与实现思路

    1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于 ...

  4. 【Spring Security】如何实现多设备同一时间只允许一个账号登录(即前登录用户被后登录用户挤下线)?只需简单两步!

    1.需求分析 在同一个系统中,我们可能只允许一个用户在一个终端上登录,一般来说这可能是出于安全方面的考虑,但是也有一些情况是出于业务上的考虑,需求就是业务原因要求一个用户只能在一个设备上登录. 要实现 ...

  5. java登陆挤下去代码_application作用域实现用户登录挤掉之前登录用户代码

    一.实现思想 1.application(servletcontext)是保存在服务器端的作用域,我们在application中保存两种形式的键值对:1:,2: 2.每当一个用户登录时(将生成一个新的 ...

  6. Spring微服务间登录用户信息共享思路

    微服务之间使用feign的RequestInterceptor拦截器实现请求头传递当前登录用户信息:各线程中使用ThreadLocal存储数据:使用SpringAOP 在Controller类的方法增 ...

  7. SharePoint里如何设置People picker值为当前登录用户值

    摘要: 相信很多朋友都遇到过需要将某个People类型的字段值设置为当前登录用户的情况而且已经给出了解决方案,因此本文没有什么新意,算法上也比较冗余,仅仅在博客里算作知识的备份. 思路: 在画面的右上 ...

  8. linux用户自动输入密码,Linux自动输入密码登录用户

    每次进去Linux系统,都有切换root用户,输入密码很麻烦,所以就写了一个小脚本,自动输入密码,登录到root用户, 1,首先检查一些是否安装了expect root@wuzs:/home/wuzs ...

  9. Spring Security登录用户数据获取(4)

    1. 登录用户数据获取   登录成功之后,在后续的业务逻辑中,开发者可能还需要获取登录成功的用户对象,如果不使用任何安全管理框架,那么可以将用户信息保存在HttpSession中,以后需要的时候直接从 ...

最新文章

  1. UNIX--stat、fstat和lstat函数
  2. 阅读器关闭时Read的尝试无效
  3. Mysql字段类型选择
  4. Objective-C中的NSNumber和NSString
  5. 标准I/O缓冲:全缓冲、行缓冲、无缓冲
  6. mysql 键 索引_五、MySQL索引和键
  7. android 如何发送短信,如何在android中发送短信
  8. 阿里云服务器最新价格表(标准收费报价表)
  9. android银联支付
  10. 和风天气更新数据失败原因分析
  11. Java8新特性(二)流式处理
  12. python数据分析经典书籍有哪些_数据分析有哪些好书值得推荐?
  13. 微信小程序实现列表页的点赞和取消点赞功能!
  14. C# 中的委托和事件[转自张子扬]
  15. 个人计算机也可以做为服务器,普通个人电脑可以充当电脑服务器来使用吗
  16. Flag壁纸生成器诞生记
  17. 满城尽带黄金甲的二三事
  18. 2022下半年火爆互联网商业模式揭晓,乐分享如何超强吸粉?详解
  19. 【Python学习教程】Python编程环境搭建
  20. python自动刷抖音视频_python+adb实现自动刷抖音视频

热门文章

  1. webpack配置entry详解
  2. scala学习之scala中一些集合的常用函数
  3. ArcGIS平台概述
  4. setting文件配置(通用型)
  5. 3060ti海力士测试
  6. python程序怎样在windows运行
  7. Single Variable Calculus 总结
  8. 链栈的入栈、出栈、获取长度、获取栈顶值等相关操作
  9. PAT 1006 换个格式输出整数 (15 分)(Java)
  10. 免费录屏软件之OBS Studio