jeecgboot 同一账号只允许一个人登录

news/2024/9/24 1:19:54/

1.需求分析

  • jeecgboot 框架要实现同一个账号只允许一个人登录,就跟游戏账号类似,“我登录了就把你踢下去,你登录了就把我踢下去”;
  • jwt 原理是生成 token 后一段时间内登录都有效,jeecgboot 中 jwt 和 redis 联合使用后,在 redis 中 用户过期的 key 是 CommonConstant.PREFIX_USER_TOKEN + token,token 几乎是唯一的
  • 想到JwtUtil.verify(cacheToken, userName, passWord)方法验证的时候想办法给他返回 false,但是发现只要 token 没过期第一个人登录的还是能访问
  • 第二个人登录后,怎样让第一个人访问不了呢?既不能改第一个人浏览器中的 token 信息,又不能把 jwt verify()方法重写了(水平不够,放弃重写);那我就直接把第一个人登录的 key(CommonConstant.PREFIX_USER_TOKEN+token)删了吧,第一人登录的 key 都没有了,这样第一人就下线了。
  • 怎样获取第一人的 key 呢,改写 key 前缀,原来是 CommonConstant.PREFIX_USER_TOKEN + token,改成CommonConstant.PREFIX_USER_TOKEN + admin + ip,去 redis 里面查询前缀是CommonConstant.PREFIX_USER_TOKEN + admin的 samePrefixKeys ,然后把 samePrefixKeys 都删了

2.上代码

在这里插入图片描述

private void onlyOnePlaceLogin(String username,String id) {List<String> keys = redisUtil.keys(CommonConstant.PREFIX_USER_TOKEN+username);keys.forEach(key -> deleteLoginInfo(key,username,id));}
//参考 logout 方法
private void deleteLoginInfo(String key, String username,String id) {//清空用户登录Token缓存redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + username);//清空用户登录Shiro权限缓存redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + id);//清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, username));}

3.关联修改

在项目中所有用到 CommonConstant.PREFIX_USER_TOKEN + tokenkey 的地方换成CommonConstant.PREFIX_USER_TOKEN + name + ip

4.最后

结束了,这个方案还没真正上线,只是本地测试没问题,欢迎大家讨论

5.参考

jeecgboot 登录用户唯一实现方式

Springboot集成JWT+Redis实现单点登录和同一账号只允许在一处登录


http://www.ppmy.cn/news/1463879.html

相关文章

原生html和js实现瀑布流布局(macyjs插件,不依赖于jquery,纯原生)

官网地址 方式一&#xff1a;在github上找到项目&#xff0c;复制demo/assets/css/macy.css&#xff0c;以及/dist/macy.js 直接引入项目 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv&qu…

QT学习(20):QStyle和自定义样式

QStyle 样式&#xff08;继承自QStyle类&#xff09;代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制&#xff0c;确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…

QT学习(20):QStyle类

Qt包含一组QStyle子类&#xff0c;这些子类&#xff08;QWindowsStyle&#xff0c;QMacStyle等&#xff09;模拟Qt支持的不同平台的样式&#xff0c;默认情况下&#xff0c;这些样式内置在Qt GUI模块中&#xff0c;样式也可以作为插件提供。 Qt的内置widgets使用QStyle来执行几…

动态内存管理—C语言通讯录

目录 一&#xff0c;动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二&#xff0c;通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一&#xff0c;动态内存函数的介绍 1.1 malloc和free void* malloc (…

关于智慧校园安全用电监测系统的设计

人生人身安全是大家关注的话题&#xff0c;2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起&#xff08;中国消防2019.12.应急管理部消防救援局官方微博&#xff09;&#xff0c;违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数&#…

三层架构有哪三层,为什么要三层

三层架构&#xff08;Three-Tier Architecture&#xff09;是一种常见的软件架构模式&#xff0c;将应用程序分为三个逻辑层次&#xff1a;表示层、业务逻辑层和数据访问层。每一层都负责处理特定的任务&#xff0c;这样的分层设计有助于提高系统的可维护性、可扩展性和灵活性。…

如何学习一个新技能

1. 提出想法 2.找到学习方法&#xff0c;学习路径 3.开始学 参考视频&#xff1a;如何成为超速学习者&#xff1f;快速学会任何新技能&#xff01;_哔哩哔哩_bilibili

(2020|ICML PMLR,线性 Transformer,核函数,RNN)Transformer 是 RNN

Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 线性 Transformers 3.1. Transformer 3.2.…