需求场景

说起登录,你可能会不屑一顾,还有比这更简单的功能吗?

获取一下用户提交参数 username + password 和数据库中一比对,有记录返回[登录成功],无记录返回[用户名或密码错误]

什么,就这?

当你熟练的打包、部署、启动项目开始了一天的摸鱼之后,产品经理开始坐不住了

“小顺子啊,你看咱们的APP登录能不能加一个功能,就是那种……那个……一个用户登录之后,能把上一个登录的自动挤下线”

此时的你陷入了沉思,怎么让他在登录之后,把上一个登录者的会话给挤下线呢?

难道说要在每次登录之后循环一遍Session列表,找到与此用户同账号的会话将其注销,聪明如你马上想到了这种方案将会给服务器带来巨大的性能压力!

那怎么办?难道要建个Map以userId做key、Session做value,建立起映射关系,然后手动取出Session做上标记[已被挤下线]?

说干就干,当你撸起袖子,噼里啪啦敲好上述逻辑之后,然后测试、打包、部署、上传一气呵成,又开始了一天的摸鱼……

然而你还是低估了产品经理的脑洞能力

“小顺子,你看你写的功能有点小问题啊,我每次一登录,就会把其它登录地给挤掉线啊。”

此时的你下意识反驳到: “有什么问题?这难道不就是你想要的效果吗?”

“en….就是….咱们能不能这样,我在手机上登录,能不能只把别的手机上给挤下线,但是我电脑上已经登录的不受影响”

“挤掉肯定是全部挤掉啊,怎么可能只留下你电脑端不挤掉呢?你要的功能不可能做到”

只见此时产品经理嘴角轻轻一笑,放出了大招:

“那人家腾讯QQ是怎么做到的呢?”

一句话暴击99999+,顿时你哑口无言,是呀,腾讯QQ怎么做到这种功能的呢?一个QQ号可以在手机和电脑上同时在线,但是却不能两个手机同时在线

难道说在登录时再记录时每次登录的设备标识?循环检测登录列表的设备名称,同设备挤下线,不同设备保持登录?

产品经理冲上咖啡,带着胜利的微笑离开了房间,只留下一脸愁容的你,冥思苦想着实现方案……

正题

好了,说了这么多,下面进入今天的主题————sa-token,一个可以让你轻松解决各种登录问题的权限认证框架!

如上述场景所言,你遇到的问题不过是三个典型的登录模型:多地登录、单地登录、同端互斥登录

多地登录:指同一账号可以在任意地点同时登录,互不影响

单地登录:在同一时间一个账号只能在一个地点登录,新登录会挤掉旧登录者

同端互斥登录:在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线

接下来让我们看看使用sa-token是如何轻松处理这三种登录问题的

多地登录

此模式较为简单,sa-token默认模式即为多地登录模式

首先添加pom.xml框架

cn.dev33

sa-token-spring-boot-starter

1.12.1

在用户登录时将账号id写入会话中

@RestController

@RequestMapping("user")

public class UserController {

@RequestMapping("doLogin")

public String doLogin(String username, String password) {

// 此处仅作示例模拟,真实项目需要从数据库中查询数据进行比对

if("zhang".equals(username) && "123456".equals(password)) {

StpUtil.setLoginId(10001);

return "登录成功";

}

return "登录失败";

}

}

新建启动类启动

@SpringBootApplication

public class SaTokenDemoApplication {

public static void main(String[] args) {

SpringApplication.run(SaTokenDemoApplication.class, args);

System.out.println("\n启动成功:sa-token配置如下:" + SaTokenManager.getConfig());

}

}

至此,我们已经完成了多地点登录的全部代码,上述代码在多人登录同一账号时将不会对旧会话做任何处理,同一账号可以在多个地点任意登录,互不影响

单地登录

单地登录与多地登录唯一的差异就是, 需要改一下yml配置文件

spring:

# sa-token配置

sa-token:

allow-concurrent-login: false

配置项 allow-concurrent-login 的含义为:是否允许同一账号并发登录 (此值为true时允许一起登录, 为false时新登录挤掉旧登录)

其它代码与[多地登录]无异,当我们在两个浏览器分别登录同一账号时,旧会话再次访问系统将会得到如下提示:

{

"code": 401,

"msg": "token已被顶下线",

"data": null,

"dataCount": null

}

同端互斥登录

好了,终于到了最终难题,同端互斥登录可以让我们像腾讯QQ一样,在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线

那么在sa-token中如何做到同端互斥登录呢?

首先如单地登录一样,在配置文件中,将 allowConcurrentLogin 配置为false,然后调用登录等相关接口时声明设备标识即可:

指定设备标识登录

StpUtil.setLoginId(10001, "PC");

调用此方法登录后,同设备的会被顶下线(不同设备不受影响),再次访问系统时会抛出 NotLoginException 异常,场景值=-4

指定设备标识强制注销(踢人下线)

StpUtil.logoutByLoginId(10001, "PC");

如果第二个参数填写null或不填,代表将这个账号id所有在线端踢下线,被踢出者再次访问系统时会抛出 NotLoginException 异常,场景值=-5

查询当前登录的设备标识

StpUtil.getLoginDevice();

结尾

以上就是sa-token框架在处理登录问题时的各种技巧,可以看出不管是简单的多地登录还是复杂的同端互斥登录,在sa-token都有完成的解决方案

sa-token是近期开源的国产优秀权限认证框架,除了各种登录认证,sa-token还可以轻松解决项目中的各种权限认证问题,

比如:踢人下线、自动续签、身份临时切换等常见业务均可以一行代码调用实现,接下来的文章我会逐一介绍这些特性,让大家对sa-token有一个全面的了解

如果觉得文章写得不错还请大家不要吝惜为文章点个赞,您的支持是我更新的最大动力!

最后附上项目链接:

官网文档:http://sa-token.dev33.cn/

Gitee开源地址: https://gitee.com/sz6/sa-token

GitHub开源地址: https://github.com/click33/sa-token

java多端登录_【Java】一个登录功能也能玩出这么多花样?sa-token带你轻松搞定多地登录、单地登录、同端互斥登录...相关推荐

  1. iframe带了token不显示_不就是登录吗,能有多复杂?sa-token带你轻松搞定多地登陆、单地登录、同端互斥登录...

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

  2. 共享会话怎么设置没访问自动断开_云共享文档这种小事,何必专业NAS出手?蒲公英X1轻松搞定...

    前段时间出差,到了目的地之后才发现,辛辛苦苦准备了好几天的资料,拷到移动硬盘里之后,居然忘记放到公文包里了,让同事帮着一看,还在办公桌上.幸好没丢在路上,又麻烦同事帮我把资料打包之后传给了我.回来之后 ...

  3. 网线重新插拔后恢复正常_生活小窍门之网线不够长怎么办,毕亚兹网线连接器轻松搞定...

    很多朋友在家中装修完时候,为了整齐和方便收纳都会把每个屋中的网口和光纤输出口集中到一起,放置到网络箱中,看起来更加整齐划一,但是装修时都不会考虑到网线要预留很长,很多时候都只留了很短的一节网线,还有的 ...

  4. excel一列求和_在excel中设置动态求和其实很简单,三个函数即可轻松搞定

    Hello,大家好,今天跟大家分享下我们如何在excel中设置动态求和的效果,如下图,当我们更改姓名和月份的时候会根据我们选择的数据自动求和,比如:我们将名字设置为刘备,截止月份设置为12月,就会对刘 ...

  5. java实现双重曝光功能_看起来很「高大上」的双重曝光,其实用手机就能轻松搞定...

    自双重曝光产生以来,它就一直是摄影爱好者热衷于尝试的摄影手法.通过双重曝光,可以为普通的照片带来神秘的意境和让人难以言喻的感觉,使得每一个场景的纹理和颜色都有了一种如梦如幻的效果,让人沉醉于其中. 在 ...

  6. kafka删除队列_没想到 Kafka 还会这样问,学会这些带你轻松搞定大厂面试!

    一.前言 自上次师兄遭受了面试官 「Kafka」 的暴击追问后,回来发奋图强,企图"「吊打面试官」",奈何还是面试官套路深啊,最近的面试,又被问到「知识盲点」了!让我们一起来看看, ...

  7. python包裹和运费_这个Python库真的太好用了,10行代码就能轻松搞定目标检测

    目标检测是指计算机和软件系统对图像或场景中的目标进行定位和识别的任务. 目标检测已广泛应用于人脸检测.车辆检测.人流量统计.网络图像.安防系统和无人驾驶等多个领域. 早期目标检测的实现基于经典算法,比 ...

  8. gwr模型用什么做_虎钳的三维模型制作你会吗?用UG软件来做这个轻松搞定

    虎钳作为机加工行业中最频繁出现的夹具,相信大家一定都不陌生,用的次数估计也不少,那么你了解UG是怎么做出虎钳模型的吗? 今天就带大家来看看虎钳模型是怎么用UG做出来的,赶紧学习起来吧! 建模过程: 一 ...

  9. 如何阻止华为杀应用_华为手机“杀”后台严重受不了?别慌,这些小技巧就能轻松搞定...

    原标题:华为手机"杀"后台严重受不了?别慌,这些小技巧就能轻松搞定 现在有越来越多的小伙伴喜欢使用华为手机,觉得其性价比非常高.但是不少使用华为手机的朋友会发现,华为手机" ...

最新文章

  1. python 输出“Hello, world”
  2. oracle row 00033,00033-ContentProvider实现数据共享[总结]
  3. WEBMIN管理Centos5.2 or RedHat5.2以上版本时samba用户不能同步系统帐户
  4. linux shell ls -l,linux之ls -l|grep ^-|wc -l命令 Shell 中常見的日志統計方法
  5. 大一C语言大作业ip合法性,c语言实现判断ip地址是否合法
  6. [转】Python--遍历列表时删除元素的正确做法
  7. HTML常见标签及个人简历制作
  8. 数字信号处理C语言——离散傅里叶变换DFT/离散傅里叶反变换IDFT
  9. 组态王串口服务器通讯不稳定,组态王通信频繁掉线
  10. ps-通道+高低频磨皮去斑
  11. 什么是原码,1’s Complement Code反码和2’s Complement Code补码
  12. @ELK集群环境部署搭建
  13. Angular报注入错误,以及解决方式,$injector:unpr
  14. 十年内将被人遗忘的15种技术:硬盘和鼠标
  15. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具
  16. 川崎机器人signal_川崎机器人信号表
  17. androidkiller java sdk环境_AndroidKiller 编译问题
  18. 数据可视化分析教学课件——FineBI实验册节选===A股走势分析
  19. Word、WPS加载MathType的方法及常见错误解决
  20. ​word分节符与分页符的区别与用法

热门文章

  1. 判断单链表是否存在环及环的入口点
  2. linearLayout和二级菜单联动
  3. Linux的目录说明
  4. vc 环境下mysql_windows-VC++6.0环境下C++链接MySQL数据库
  5. java自动类型提升_Java中的基本数据类型转换(自动、强制、提升)
  6. python用时间戳给文件命名-在Python中每小时将时间戳记写入文件
  7. Monkey稳定性测试,多少还是要了解一下的(上)
  8. Python助力性能测试——报文批量生成
  9. python3+telnetlib实现简单自动测试
  10. 傻瓜式配置samba服务