重构概念:User-Session -> Account-Session

This commit is contained in:
click33
2023-05-15 18:23:18 +08:00
parent d6037878e8
commit aaa26a4c58
18 changed files with 1247 additions and 2054 deletions

View File

@@ -2,7 +2,7 @@
---
### 1、User-Session
### 1、Account-Session
提起Session你脑海中最先浮现的可能就是 JSP 中的 HttpSession它的工作原理可以大致总结为
@@ -24,17 +24,17 @@ Sa-Token Session可以理解为 HttpSession 的升级版:
3. Sa-Token支持Cookie、Header、body三个途径提交Token而不是仅限于Cookie
4. 由于不强依赖Cookie所以只要将Token存储到不同的地方便可以做到一个客户端同时登录多个账号
这种为账号id分配的Session我们给它起一个合适的名字`User-Session`,你可以通过如下方式操作它:
这种为账号id分配的Session我们给它起一个合适的名字`Account-Session`,你可以通过如下方式操作它:
``` java
// 获取当前会话的 User-Session
// 获取当前会话的 Account-Session
SaSession session = StpUtil.getSession();
// 从 User-Session 中读取、写入数据
// 从 Account-Session 中读取、写入数据
session.get("name");
session.set("name", "张三");
```
使用`User-Session`在不同端同步数据是非常方便的,因为只要 PC 和 APP 登录的账号id一致它们对应的都是同一个Session
使用`Account-Session`在不同端同步数据是非常方便的,因为只要 PC 和 APP 登录的账号id一致它们对应的都是同一个Session
举个应用场景在PC端点赞的帖子列表在APP端的点赞记录里也要同步显示出来
@@ -44,13 +44,13 @@ session.set("name", "张三");
> 指定客户端超过两小时无操作就自动下线,如果两小时内有操作,就再续期两小时,直到新的两小时无操作
那么这种请求访问记录应该存储在哪里呢?放在 User-Session 里吗?
那么这种请求访问记录应该存储在哪里呢?放在 Account-Session 里吗?
可别忘了PC端和APP端可是共享的同一个 User-Session ,如果把数据放在这里,
可别忘了PC端和APP端可是共享的同一个 Account-Session ,如果把数据放在这里,
那就意味着即使用户在PC端一直无操作只要手机上用户还在不间断的操作那PC端也不会过期
解决这个问题的关键在于虽然两个设备登录的是同一账号但是两个它们得到的token是不一样的
Sa-Token针对会话登录不仅为账号id分配了`User-Session`同时还为每个token分配了不同的`Token-Session`
Sa-Token针对会话登录不仅为账号id分配了`Account-Session`同时还为每个token分配了不同的`Token-Session`
不同的设备端哪怕登录了同一账号只要它们得到的token不一致它们对应的 `Token-Session` 就不一致,这就为我们不同端的独立数据读写提供了支持:
@@ -91,7 +91,7 @@ session.updateTimeout(1000); // 参数说明和全局有效期保持一致
三种Session创建时机
- `User-Session`: 指的是框架为每个 账号id 分配的 Session
- `Account-Session`: 指的是框架为每个 账号id 分配的 Session
- `Token-Session`: 指的是框架为每个 token 分配的 Session
- `Custom-Session`: 指的是以一个 特定的值 作为SessionId来分配的 Session
@@ -101,7 +101,7 @@ session.updateTimeout(1000); // 参数说明和全局有效期保持一致
![session-model](https://oss.dev33.cn/sa-token/doc/session-model3.png 's-w')
简而言之:
- `User-Session` 以UserId为主只要token指向的UserId一致那么对应的Session对象就一致
- `Account-Session` 以账号 id 为主,只要 token 指向的账号 id 一致那么对应的Session对象就一致
- `Token-Session` 以token为主只要token不同那么对应的Session对象就不同
- `Custom-Session` 以特定的key为主不同key对应不同的Session对象同样的key指向同一个Session对象

View File

@@ -13,7 +13,7 @@ token信息Model: 用来描述一个token的常用参数
"loginId": "10001", // 此token对应的LoginId未登录时为null
"loginType": "login", // 账号类型标识
"tokenTimeout": 2591977, // token剩余有效期 (单位: 秒)
"sessionTimeout": 2591977, // User-Session剩余有效时间 (单位: 秒)
"sessionTimeout": 2591977, // Account-Session剩余有效时间 (单位: 秒)
"tokenSessionTimeout": -2, // Token-Session剩余有效时间 (单位: 秒) (-2表示系统中不存在这个缓存)
"tokenActivityTimeout": -1, // token剩余无操作有效时间 (单位: 秒)
"loginDevice": "default-device" // 登录设备类型