sa-token/sa-token-doc/doc/fun/token-timeout.md

50 lines
2.5 KiB
Markdown
Raw Normal View History

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
2021-06-19 01:38:37 +08:00
Sa-Token 提供两种Token自动过期策略分别是`timeout`与`activity-timeout`,其详细用法如下:
2020-12-25 00:16:12 +08:00
### timeout
2021-06-19 01:38:37 +08:00
1. `timeout`代表Token的长久有效期单位/秒,例如将其配置为 2592000 (30天)代表在30天后Token必定过期无法继续使用
2. `timeout`无法续签,想要继续使用必须重新登录
3. `timeout`的值配置为-1后代表永久有效不会过期
2020-12-25 00:16:12 +08:00
### activity-timeout
2021-06-19 01:38:37 +08:00
1. `activity-timeout`代表临时有效期,单位/秒,例如将其配置为 1800 (30分钟)代表用户如果30分钟无操作则此Token会立即过期
2. 如果在30分钟内用户有操作则会再次续签30分钟用户如果一直操作则会一直续签直到连续30分钟无操作Token才会过期
3. `activity-timeout`的值配置为-1后代表永久有效不会过期此时也无需频繁续签
2020-12-25 00:16:12 +08:00
### 关于activity-timeout的续签
2021-06-19 01:38:37 +08:00
如果`activity-timeout`配置了大于零的值Sa-Token 会在登录时开始计时,在每次直接或间接调用`getLoginId()`时进行一次过期检查与续签操作。
2020-12-25 00:16:12 +08:00
此时会有两种情况:
2021-06-19 01:38:37 +08:00
1. 一种是会话无操作时间太长Token已经过期此时框架会抛出`NotLoginException`异常(场景值=-3)
2. 另一种则是会话在`activity-timeout`有效期内通过检查此时Token可以成功续签
2020-12-25 00:16:12 +08:00
### 我可以手动续签吗?
**可以!**
2021-06-19 01:38:37 +08:00
如果框架的自动续签算法无法满足您的业务需求你可以进行手动续签Sa-Token 提供两个API供你操作
1. `StpUtil.checkActivityTimeout()`: 检查当前Token 是否已经[临时过期],如果已经过期则抛出异常
2. `StpUtil.updateLastActivityToNow()`: 续签当前Token(将 [最后操作时间] 更新为当前时间戳)
2021-06-19 01:38:37 +08:00
注意在手动续签时即使Token已经 [临时过期] 也可续签成功如果此场景下需要提示续签失败可采用先检查再续签的形式保证Token有效性
例如以下代码:
2020-12-25 00:16:12 +08:00
``` java
2021-02-12 01:57:31 +08:00
// 先检查是否已过期
StpUtil.checkActivityTimeout();
// 检查通过后继续续签
StpUtil.updateLastActivityToNow();
2020-12-25 00:16:12 +08:00
```
同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作
2020-12-25 00:16:12 +08:00
### timeout与activity-timeout可以同时使用吗
**可以同时使用!**
2020-12-25 00:16:12 +08:00
两者的认证逻辑彼此独立,互不干扰,可以同时使用。