From 82ee90f7125a5cea6d509381c03dec63469a7e50 Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Tue, 5 Jan 2021 16:07:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E7=AB=AF=E4=BA=92=E6=96=A5=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=9A=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/stp/StpLogic.java | 4 +- .../java/cn/dev33/satoken/stp/StpUtil.java | 4 +- sa-token-doc/doc/_sidebar.md | 1 + sa-token-doc/doc/use/mutex-login.md | 39 +++++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 sa-token-doc/doc/use/mutex-login.md diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index 1e4b8ffa..c8060c57 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -891,7 +891,7 @@ public class StpLogic { } /** - * 获取指定loginId的tokenValue + * 获取指定loginId指定设备端的tokenValue *
在配置为允许并发登录时,此方法只会返回队列的最后一个token, * 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId * @param loginId 账号id @@ -913,7 +913,7 @@ public class StpLogic { } /** - * 获取指定loginId的tokenValue集合 + * 获取指定loginId指定设备端的tokenValue 集合 * @param loginId 账号id * @param device 设备标识 * @return 此loginId的所有相关token diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index d9e8490f..786f3ad8 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -402,7 +402,7 @@ public class StpUtil { } /** - * 获取指定loginId的tokenValue + * 获取指定loginId指定设备端的tokenValue *
在配置为允许并发登录时,此方法只会返回队列的最后一个token,
* 如果你需要返回此账号id的所有token,请调用 getTokenValueListByLoginId
* @param loginId 账号id
@@ -423,7 +423,7 @@ public class StpUtil {
}
/**
- * 获取指定loginId的tokenValue集合
+ * 获取指定loginId指定设备端的tokenValue集合
* @param loginId 账号id
* @param device 设备标识
* @return 此loginId的所有相关token
diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md
index f0db84c1..e76e2dce 100644
--- a/sa-token-doc/doc/_sidebar.md
+++ b/sa-token-doc/doc/_sidebar.md
@@ -14,6 +14,7 @@
- [无Cookie模式(前后台分离)](/use/not-cookie)
- [模拟他人](/use/mock-person)
- [多账号验证](/use/many-account)
+ - [同端互斥登录](/use/mutex-login)
- [注解式鉴权](/use/at-check)
- [花式token](/use/token-style)
- [框架配置](/use/config)
diff --git a/sa-token-doc/doc/use/mutex-login.md b/sa-token-doc/doc/use/mutex-login.md
new file mode 100644
index 00000000..fa87080a
--- /dev/null
+++ b/sa-token-doc/doc/use/mutex-login.md
@@ -0,0 +1,39 @@
+# 同端互斥登录
+
+如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号
+同端互斥登录,指的就是像腾讯QQ一样,在同一类型设备上只允许单地点登录,在不同类型设备上允许同时在线
+
+---
+
+## 具体API
+
+在`sa-token`中如何做到同端互斥登录?
+首先在配置文件中,将 `allowConcurrentLogin` 配置为false,然后调用登录等相关接口时声明设备标识即可:
+
+
+#### 指定设备标识登录
+``` java
+StpUtil.setLoginId(10001, "PC"); // 指定`账号id`和`设备标识`进行登录
+```
+调用此方法登录后,同设备的会被顶下线(不同设备不受影响),再次访问系统时会抛出 `NotLoginException` 异常,场景值=`-4`
+
+
+#### 指定设备标识强制注销
+``` java
+StpUtil.logoutByLoginId(10001, "PC"); // 指定`账号id`和`设备标识`进行强制注销 (踢人下线)
+```
+如果第二个参数填写null或不填,代表将这个账号id所有在线端踢下线,被踢出者再次访问系统时会抛出 `NotLoginException` 异常,场景值=`-5`
+
+
+#### 查询当前登录的设备标识
+``` java
+StpUtil.getLoginDevice(); // 指返回当前token的登录设备
+```
+
+
+#### id反查token
+``` java
+StpUtil.getTokenValueByLoginId(10001, "APP"); // 获取指定loginId指定设备端的tokenValue
+```
+
+