2021-06-19 01:38:37 +08:00
|
|
|
|
# Token有效期详解
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
2021-06-19 01:38:37 +08:00
|
|
|
|
<!-- 本篇介绍Token有效期的详细用法 -->
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
2023-06-06 06:18:52 +08:00
|
|
|
|
Sa-Token 提供两种 Token 自动过期策略,分别是 `timeout` 与 `active-timeout`,配置方法如下:
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
2022-10-20 13:06:36 +08:00
|
|
|
|
<!---------------------------- tabs:start ---------------------------->
|
|
|
|
|
<!------------- tab:yaml 风格 ------------->
|
|
|
|
|
``` yaml
|
2022-09-22 15:51:23 +08:00
|
|
|
|
sa-token:
|
2023-05-11 05:35:43 +08:00
|
|
|
|
# token 有效期(单位:秒),默认30天,-1代表永不过期
|
|
|
|
|
timeout: 2592000
|
|
|
|
|
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
|
2023-06-06 06:18:52 +08:00
|
|
|
|
active-timeout: -1
|
2022-09-22 15:51:23 +08:00
|
|
|
|
```
|
2022-10-20 13:06:36 +08:00
|
|
|
|
<!------------- tab:properties 风格 ------------->
|
|
|
|
|
``` properties
|
2023-05-11 05:35:43 +08:00
|
|
|
|
# token 有效期(单位:秒),默认30天,-1代表永不过期
|
2022-10-20 13:06:36 +08:00
|
|
|
|
sa-token.timeout=2592000
|
2023-05-11 05:35:43 +08:00
|
|
|
|
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
|
2023-06-06 06:18:52 +08:00
|
|
|
|
sa-token.active-timeout=-1
|
2022-10-20 13:06:36 +08:00
|
|
|
|
```
|
|
|
|
|
<!---------------------------- tabs:end ---------------------------->
|
|
|
|
|
|
2022-09-22 15:51:23 +08:00
|
|
|
|
|
|
|
|
|
两者的区别,可以通过下面的例子体现:
|
|
|
|
|
|
2024-07-29 00:43:55 +08:00
|
|
|
|
> [!TIP| label:场景示例]
|
2022-09-22 15:51:23 +08:00
|
|
|
|
> 1. 假设你到银行要存钱,首先就要办理一张卡 (要访问系统接口先登录)。
|
|
|
|
|
> 2. 银行为你颁发一张储蓄卡(系统为你颁发一个Token),以后每次存取钱都要带上这张卡(后续每次访问系统都要提交 Token)。
|
|
|
|
|
> 3. 银行为这张卡设定两个过期时间:
|
|
|
|
|
> - 第一个是 `timeout`,代表这张卡的长久有效期,就是指这张卡最长能用多久,假设 `timeout=3年`,那么3年后此卡将被银行删除,想要继续来银行办理业务必须重新办卡(Token 过期后想要访问系统必须重新登录)。
|
2023-06-06 06:18:52 +08:00
|
|
|
|
> - 第二个就是 `active-timeout`,代表这张卡的最低活跃频率限制,就是指这张卡必须每隔多久来银行一次,假设 `active-timeout=1月` ,你如果超过1月不来办一次业务,银行就将你的卡冻结,列为长期不动户(Token 长期不访问系统,被冻结,但不会被删除)。
|
2022-09-22 15:51:23 +08:00
|
|
|
|
> 4. 两个过期策略可以单独配置,也可以同时配置,只要有其中一个有效期超出了范围,这张卡就会变得不可用(两个有效期只要有一个过期了,Token就无法成功访问系统了)。
|
|
|
|
|
|
|
|
|
|
下面是对两个过期策略的详细解释:
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
|
|
|
|
### timeout
|
2023-05-11 05:35:43 +08:00
|
|
|
|
1. `timeout`代表 Token 的长久有效期,单位/秒,例如将其配置为 2592000 (30天),代表在30天后,Token必定过期,无法继续使用。
|
2022-02-08 16:05:54 +08:00
|
|
|
|
2. `timeout`~~无法续签,想要继续使用必须重新登录~~。v1.29.0+ 版本新增续期方法:`StpUtil.renewTimeout(100)`。
|
2023-05-11 05:35:43 +08:00
|
|
|
|
3. `timeout`的值配置为-1后,代表永久有效,不会过期。
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
|
|
|
|
|
2023-06-06 06:18:52 +08:00
|
|
|
|
### active-timeout
|
|
|
|
|
1. `active-timeout`代表最低活跃频率,单位/秒,例如将其配置为 1800 (30分钟),代表用户如果30分钟无操作,则此Token会立即过期(被冻结,但不会删除掉)。
|
2023-05-11 05:35:43 +08:00
|
|
|
|
2. 如果在30分钟内用户有操作,则会再次续签30分钟,用户如果一直操作则会一直续签,直到连续30分钟无操作,Token才会过期。
|
2023-06-06 06:18:52 +08:00
|
|
|
|
3. `active-timeout`的值配置为-1后,代表永久有效,不会过期,此时也无需频繁续签。
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
|
|
|
|
|
2023-06-06 06:18:52 +08:00
|
|
|
|
### 关于active-timeout的续签
|
|
|
|
|
如果`active-timeout`配置了大于零的值,Sa-Token 会在登录时开始计时,在每次直接或间接调用`getLoginId()`时进行一次冻结检查与续签操作。
|
2020-12-25 00:16:12 +08:00
|
|
|
|
此时会有两种情况:
|
2023-05-11 05:35:43 +08:00
|
|
|
|
1. 一种是会话无操作时间太长,Token已经被冻结,此时框架会抛出`NotLoginException`异常(场景值=-3),
|
2023-06-06 06:18:52 +08:00
|
|
|
|
2. 另一种则是会话在`active-timeout`有效期内通过检查,此时Token可以成功续签
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
|
|
|
|
|
2023-06-06 06:18:52 +08:00
|
|
|
|
### 我可以手动续签 active-timeout 吗?
|
2020-12-25 00:16:12 +08:00
|
|
|
|
**可以!**
|
2021-06-19 01:38:37 +08:00
|
|
|
|
如果框架的自动续签算法无法满足您的业务需求,你可以进行手动续签,Sa-Token 提供两个API供你操作:
|
2023-06-06 06:18:52 +08:00
|
|
|
|
1. `StpUtil.checkActiveTimeout()`: 检查当前Token 是否已经被冻结,如果是则抛出异常
|
|
|
|
|
2. `StpUtil.updateLastActiveToNow()`: 续签当前Token:(将 [最后操作时间] 更新为当前时间戳)
|
2021-02-06 15:52:49 +08:00
|
|
|
|
|
2023-05-11 05:35:43 +08:00
|
|
|
|
注意:在手动续签时,即使 Token 已经被冻结也可续签成功(解冻),如果此场景下需要提示续签失败,可采用先检查再续签的形式保证Token有效性
|
2021-02-06 15:52:49 +08:00
|
|
|
|
|
|
|
|
|
例如以下代码:
|
2020-12-25 00:16:12 +08:00
|
|
|
|
``` java
|
2023-05-11 05:35:43 +08:00
|
|
|
|
// 先检查是否已被冻结
|
2023-06-06 06:18:52 +08:00
|
|
|
|
StpUtil.checkActiveTimeout();
|
2021-02-12 01:57:31 +08:00
|
|
|
|
// 检查通过后继续续签
|
2023-06-06 06:18:52 +08:00
|
|
|
|
StpUtil.updateLastActiveToNow();
|
2020-12-25 00:16:12 +08:00
|
|
|
|
```
|
|
|
|
|
|
2021-02-04 21:54:54 +08:00
|
|
|
|
同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作
|
|
|
|
|
|
2022-09-25 12:07:44 +08:00
|
|
|
|
如果你需要给其它 Token 续签:
|
|
|
|
|
|
|
|
|
|
``` java
|
|
|
|
|
// 为指定 Token 续签
|
2023-06-06 06:18:52 +08:00
|
|
|
|
StpUtil.stpLogic.updateLastActiveToNow(tokenValue);
|
2022-09-25 12:07:44 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-12-25 00:16:12 +08:00
|
|
|
|
|
2023-06-06 06:18:52 +08:00
|
|
|
|
### timeout 与 active-timeout 可以同时使用吗?
|
2021-02-06 15:52:49 +08:00
|
|
|
|
**可以同时使用!**
|
2020-12-25 00:16:12 +08:00
|
|
|
|
两者的认证逻辑彼此独立,互不干扰,可以同时使用。
|
|
|
|
|
|
2023-05-11 05:35:43 +08:00
|
|
|
|
|
2023-06-06 06:18:52 +08:00
|
|
|
|
### StpUtil 类中哪些公开方法支持自动续签 active-timeout?
|
2022-09-25 10:26:26 +08:00
|
|
|
|
> 直接或间接获取了当前用户id的方法 (间接调用过 StpLogic.getLoginId() 方法)
|
2022-03-11 10:06:52 +08:00
|
|
|
|
|
2023-05-11 05:35:43 +08:00
|
|
|
|
| 包括但不限于这些: |
|
2022-03-11 10:06:52 +08:00
|
|
|
|
|---|
|
|
|
|
|
| StpUtil.checkLogin() |
|
|
|
|
|
| StpUtil.getLoginId() |
|
|
|
|
|
| StpUtil.getLoginIdAsInt() |
|
|
|
|
|
| StpUtil.getLoginIdAsString() |
|
|
|
|
|
| StpUtil.getLoginIdAsLong() |
|
|
|
|
|
|---|
|
|
|
|
|
| StpUtil.getSession() |
|
|
|
|
|
| StpUtil.getTokenSession() |
|
|
|
|
|
|---|
|
|
|
|
|
| StpUtil.getRoleList() |
|
|
|
|
|
| StpUtil.hasRole() |
|
|
|
|
|
| StpUtil.hasRoleAnd() |
|
|
|
|
|
| StpUtil.hasRoleOr() |
|
|
|
|
|
| StpUtil.checkRole() |
|
|
|
|
|
| StpUtil.checkRoleAnd() |
|
|
|
|
|
| StpUtil.checkRoleOr() |
|
|
|
|
|
|---|
|
|
|
|
|
| StpUtil.getPermissionList() |
|
|
|
|
|
| StpUtil.hasPermission() |
|
|
|
|
|
| StpUtil.hasPermissionAnd() |
|
|
|
|
|
| StpUtil.hasPermissionOr() |
|
|
|
|
|
| StpUtil.checkPermission() |
|
|
|
|
|
| StpUtil.checkPermissionAnd() |
|
|
|
|
|
| StpUtil.checkPermissionOr() |
|
|
|
|
|
|---|
|
|
|
|
|
| StpUtil.openSafe() |
|
|
|
|
|
| StpUtil.isSafe() |
|
|
|
|
|
| StpUtil.checkSafe() |
|
|
|
|
|
| StpUtil.getSafeTime() |
|
|
|
|
|
| StpUtil.closeSafe() |
|
|
|
|
|
|
2022-03-31 11:09:00 +08:00
|
|
|
|
> 以下注解都间接调用过 getLoginId() 方法
|
2022-03-11 10:06:52 +08:00
|
|
|
|
|
2022-03-31 11:09:00 +08:00
|
|
|
|
| 支持自动续签的注解 |
|
|
|
|
|
|---|
|
|
|
|
|
| @SaCheckLogin |
|
|
|
|
|
| @SaCheckRole |
|
|
|
|
|
| @SaCheckPermission |
|
|
|
|
|
| @SaCheckSafe |
|