需求场景

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

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

什么,就这?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


正题

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

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

  • 多地登录:指同一账号可以在任意地点同时登录,互不影响
  • 单地登录:在同一时间一个账号只能在一个地点登录,新登录会挤掉旧登录者
  • 同端互斥登录:在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线

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

多地登录

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

  1. 首先添加pom.xml框架
<!-- sa-token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.12.1</version>
</dependency>
  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 "登录失败";
}
}
  1. 新建启动类启动
@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有一个全面的了解

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

最后附上项目链接:

一个登录功能也能玩出这么多花样?sa-token带你轻松搞定多地登录、单地登录、同端互斥登录的更多相关文章

  1. 几行c#代码,轻松搞定一个女大学生

    几行c#代码,轻松搞定一个女大学生 的作业... 哈哈,标题党了哈,但是是真的,在外面敲代码,想赚点外快,接到了一个学生的期末考试,是一个天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找 ...

  2. sa-token v1.9.0 版本已发布,带来激动人心新特性:同端互斥登录

    sa-token是什么? sa-token是一个JavaWeb轻量级权限认证框架, 官网首页:http://sa-token.dev33.cn/ 如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它 ...

  3. python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!

    你好 由于你是游客 无法查看本文 请你登录再进 谢谢合作 当你在爬某些网站的时候 需要你登录才可以获取数据 咋整? 莫慌 小帅b把这几招传授给你 让你以后从容应对 那么 接下来就是 学习 python ...

  4. 从0 开始手写一个 RPC 框架,轻松搞定!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:juejin.im/post/5c4481a4f265da613438aec3 之前在 RPC框架底层到底什么原理得知 ...

  5. PHP导出Excel一个方法轻松搞定

    /** * 导出数据为excel表格 *@param $data 一个二维数组,结构如同从数据库查出来的数组 *@param $title excel的第一行标题,一个数组,如果为空则没有标题 *@p ...

  6. redis实践:用户注册登录功能

    本节将使用PHP和Redis实现用户注册登录功能,下面分模块来介绍具体实现方法. 1.注册 需求描述:用户注册时需要提交邮箱.登录密码和昵称.其中邮箱是用户的唯一标识,每个用户的邮箱不能重复,但允许用 ...

  7. 初识sa-token,一行代码搞定登录授权!

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

  8. 我的第一个python web开发框架(14)——后台管理系统登录功能

    接下来正式进入网站的功能开发.要完成后台管理系统登录功能,通过查看登录页面,我们可以了解到,我们需要编写验证码图片获取接口和登录处理接口,然后在登录页面的HTML上编写AJAX. 在进行接口开发之前, ...

  9. Android Studio 通过一个登录功能介绍SQLite数据库的使用

    前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目.它的设计目标是嵌入式的,而且目前已经在 ...

  10. 一步步开发自己的博客 .NET版(3、注册登录功能)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

随机推荐

  1. re模块 函数模式详解

    re模块 python爬虫过程中,实现页面元素解析的方法很多,正则解析只是其中之一,常见的还有BeautifulSoup和lxml,它们都支持网页HTML元素解析,re模块提供了强大的正则表达式功能 ...

  2. Git之常用文件

    git项目中的特殊文件, 常见文件有.gitignore, .gitkeep 1) .gitkeep git默认是不允许提交一个空的目录到版本库上的, 可以在空的文件夹里面建立一个.gitkeep文件 ...

  3. Golang网络模型netpoll源码解析

    0.引言 在学习完了Socket编程的基础知识.Linux系统提供的I/O多路复用的实现以及Golang的GMP调度模型之后,我们进而学习Golang的网络模型--netpoll.本文将从为什么需要使 ...

  4. wps文字表格邮件附件部分图片无法预览的问题(1)

    使用邮箱客户端发送带word附件的邮件时,客户说部分图片无法查看.我方人员测试下,得到如下几点: 1.出问题的.docx文件下载后可以正常打开查看,但通过给自己邮箱转发邮件(包含附件),foxmail ...

  5. Java设计模式——职责链模式:解锁高效灵活的请求处理之道

    嘿,各位 Java 编程大神和爱好者们!今天咱们要一同深入探索一种超厉害的设计模式--职责链模式.它就像一条神奇的"处理链",能让请求在多个对象之间有条不紊地传递,直到找到最合适的 ...

  6. ai大模型流式输出------基于SSE协议的长连接实现

    传统的http1.0请求开发,已经满足了我们日常的web开发.一般请求就像下图这样子,客服端发起一个请求(触发),服务端做出一个响应(动作): 有时会有诸如实时刷新,实时显示的场景,我们往往是客户端定 ...

  7. 一款 IDEA 必备的 JSON 处理工具插件 — Json Assistant

    Json Assistant 是基于 IntelliJ IDEs 的 JSON 工具插件,让 JSON 处理变得更轻松! 主要功能 完全支持 JSON5 JSON 窗口(多选项卡) 选项卡更名 移动至 ...

  8. Java并发 —— 线程并发(二)

    Java 锁  Java 中的锁是在多线程环境下,保证共享资源健康,线程安全的一种手段  线程操作某个共享资源之前,先对资源加一层锁,保证操作期间没有其他线程访问资源,操作完成后再释放锁 保持数据一致 ...

  9. Mysql之innodb引擎

    优势总结 只有数据库引擎为innodb且事务的隔离级别repeatable--read (可重复读)的时候 才会使用mvcc来实现多版本控制 事务中的可重复读可以有效的避免幻读问题 innodb从硬盘 ...

  10. 【Amadeus原创】docker安装apache

    1, docker下载apache [root@it-1c2d webnav]# docker search apache [root@it-1c2d webnav]# docker pull htt ...