docs: 重构 TokenSign -> SaTerminalInfo

This commit is contained in:
click33 2025-03-08 15:21:40 +08:00
parent 7d2fac7d98
commit 850af6c131
5 changed files with 45 additions and 30 deletions

View File

@ -21,16 +21,16 @@ session.setCreateTime(createTime); // 写入此 Session 的创建时间(时
```
### 3、TokenSign 相关
### 3、SaTerminalInfo 相关
``` java
session.setTokenSignList(tokenSignList); // 写入此 Session 绑定的 Token 签名列表
session.getTokenSignList(); // 获取此 Session 绑定的 Token 签名列表
session.tokenSignListCopy(); // 获取 Token 签名列表 的拷贝副本
session.tokenSignListCopyByDevice(device); // 返回 Token 签名列表 的拷贝副本,根据 device 筛选
session.getTokenSign(tokenValue); // 查找一个 Token 签名
session.addTokenSign(tokenSign); // 添加一个 Token 签名
session.addTokenSign(tokenValue, device); // 添加一个 Token 签名
session.removeTokenSign(tokenValue); // 移除一个 Token 签名
session.setTerminalList(terminalList); // 写入登录终端信息列表
session.getTerminalList(); // 获取登录终端信息列表
session.terminalListCopy(); // 获取 登录终端信息列表 (拷贝副本)
session.getTerminalListByDeviceType(deviceType); // 获取 登录终端信息列表 (拷贝副本),根据 deviceType 筛选
session.getTerminal(tokenValue); // 查找一个终端信息,根据 tokenValue
session.addTerminal(terminal); // 添加一个终端信息
session.removeTerminal(tokenValue); // 移除一个终端信息
session.maxTerminalIndex(); // 获取最大的终端索引值如无返0
```
@ -38,7 +38,7 @@ session.removeTokenSign(tokenValue); // 移除一个 Token 签名
``` java
session.update(); // 更新Session从持久库更新刷新一下
session.logout(); // 注销Session (从持久库删除)
session.logoutByTokenSignCountToZero(); // 当Session上的tokenSign数量为零时,注销会话
session.logoutByTerminalCountToZero(); // 当 Session 上的 SaTerminalInfo 数量为零时,注销会话
session.getTimeout(); // 获取此Session的剩余存活时间 (单位: 秒)
session.updateTimeout(timeout); // 修改此Session的剩余存活时间
session.updateMinTimeout(minTimeout); // 修改此Session的最小剩余存活时间 (只有在 Session 的过期时间低于指定的 minTimeout 时才会进行修改)

View File

@ -32,15 +32,20 @@ SaLoginParameter 配置示例:
``` java
// SaLoginParameter 配置登录相关参数
StpUtil.login(10001, new SaLoginParameter()
.setDevice("PC") // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
.setIsLastingCookie(true) // 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在
.setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的 timeout 值)
.setToken("xxxx-xxxx-xxxx-xxxx") // 预定此次登录生成的Token
.setExtra("name", "zhangsan") // Token挂载的扩展参数 此方法只有在集成jwt插件时才会生效
.setIsWriteHeader(false) // 是否在登录后将 Token 写入到响应头
.setActiveTimeout(300) // 指定此次登录token的最低活跃频率, 单位:秒设置此参数需要在配置文件打开dynamicActiveTimeout=true
.setTokenSignTag("xxx") // 指定此次登录挂载在 TokenSign 上的 tag 值, 任意值
);
.setDeviceType("PC") // 此次登录的客户端设备类型, 一般用于完成 [同端互斥登录] 功能
.setDeviceId("xxxxxxxxx") // 此次登录的客户端设备ID, 登录成功后该设备将标记为可信任设备
.setIsLastingCookie(true) // 是否为持久Cookie临时Cookie在浏览器关闭时会自动删除持久Cookie在重新打开后依然存在
.setTimeout(60 * 60 * 24 * 7) // 指定此次登录 token 的有效期, 单位:秒,-1=永久有效
.setActiveTimeout(60 * 60 * 24 * 7) // 指定此次登录 token 的最低活跃频率, 单位:秒,-1=不进行活跃检查
.setIsConcurrent(true) // 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
.setIsShare(true) // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个token, 为 false 时每次登录新建一个 token
.setMaxLoginCount(12) // 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true, isShare=false 时此配置项才有意义)
.setMaxTryTimes(12) // 在每次创建 token 时的最高循环次数,用于保证 token 唯一性(-1=不循环尝试,直接使用)
.setExtra("key", "value") // 记录在 Token 上的扩展参数(只在 jwt 模式下生效)
.setToken("xxxx-xxxx-xxxx-xxxx") // 预定此次登录的生成的Token
.setIsWriteHeader(false) // 是否在登录后将 Token 写入到响应头
.setTerminalExtra("key", "value")// 本次登录挂载到 SaTerminalInfo 的自定义扩展数据
);
```

View File

@ -110,14 +110,24 @@ value 格式
"name": "张三" // 此 session 挂载数据 详情
// 更多值 ...
},
"tokenSignList": [ // 客户端 token 信息列表Account-Session才会有值
"terminalList": [ // 已登录终端信息列表Account-Session才会有值
"java.util.Vector",
[
{
"@class": "cn.dev33.satoken.session.TokenSign",
"value": "06d1f12b-614e-4c00-8d8e-c07fef5f4aa9", // 客户端 token 值
"device": "default-device", // 登录设备
"tag": null // 挂载自定义值
"@class": "cn.dev33.satoken.session.SaTerminalInfo",
"index": 1,
"tokenValue": "2551663f-bb98-47d7-9af3-e2e6a28dadce", // 客户端 token 值
"deviceType": "default-device", // 登录设备类型
"deviceId": "xxxxxxxxx", // 登录设备id
"extraData": {
// 扩展信息列表 (手动自定义值)
"@class": "java.util.LinkedHashMap",
"deviceSimpleTitle": "XiaoMi 15 Ultra",
"loginAddress": "浙江省杭州市西湖区",
"loginIp": "127.0.0.1",
"loginTime": "2025-03-08 15:00:02"
},
"createTime": 1741406340845 // 登录时间
}
]
]

View File

@ -65,9 +65,9 @@ for (String sessionId : sessionIdList) {
// 根据会话id查询对应的 SaSession 对象,此处一个 SaSession 对象即代表一个登录的账号
SaSession session = StpUtil.getSessionBySessionId(sessionId);
// 查询这个账号都在哪些设备登录了依据上面的示例账号A 的 tokenSign 数量是 3账号B 的 tokenSign 数量是 2
List<TokenSign> tokenSignList = session.getTokenSignList();
System.out.println("会话id" + sessionId + ",共在 " + tokenSignList.size() + " 设备登录");
// 查询这个账号都在哪些设备登录了依据上面的示例账号A 的 SaTerminalInfo 数量是 3账号B 的 SaTerminalInfo 数量是 2
List<SaTerminalInfo> terminalList = session.terminalListCopy();
System.out.println("会话id" + sessionId + ",共在 " + terminalList.size() + " 设备登录");
}
```

View File

@ -410,10 +410,10 @@ sa-token.oauth2-server.oidc.idTokenTimeout=600
配置含义:同一账号最大登录数量。
在配置 `isConcurrent=true`, `isShare=false`Sa-Token 将允许同一账号并发登录且每次登录都会产生一个新Token
这些 Token 都会以 `TokenSign` 的形式记录在其 `Account-Session` 之上,这就造成一个问题:
这些 Token 都会以 `SaTerminalInfo` 的形式记录在其 `Account-Session` 之上,这就造成一个问题:
随着同一账号登录的次数越来越多,TokenSign 的列表也会越来越大,极端情况下,列表长度可能达到成百上千以上,严重拖慢数据处理速度,
为此 Sa-Token 对这个 TokenSign 列表的大小设定一个上限值,也就是 `maxLoginCount`,默认值=12。
随着同一账号登录的次数越来越多,SaTerminalInfo 的列表也会越来越大,极端情况下,列表长度可能达到成百上千以上,严重拖慢数据处理速度,
为此 Sa-Token 对这个 SaTerminalInfo 列表的大小设定一个上限值,也就是 `maxLoginCount`,默认值=12。
假设一个账号的登录数量超过 `maxLoginCount` 后,将会主动注销第一个登录的会话(先进先出),以此保证队列中的有效会话数量始终 `<= maxLoginCount` 值。