From facb7ca9b6317b76d4d40f67273573262afa48a4 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 11 May 2023 05:35:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=A6=82=E5=BF=B5=EF=BC=9A?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=9C=89=E6=95=88=E6=9C=9F=20->=20token=20?= =?UTF-8?q?=E6=9C=80=E4=BD=8E=E6=B4=BB=E8=B7=83=E9=A2=91=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev33/satoken/config/SaTokenConfig.java | 20 +++---- .../cn/dev33/satoken/error/SaErrorCode.java | 2 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 56 +++++++++--------- .../java/cn/dev33/satoken/stp/StpUtil.java | 10 ++-- sa-token-doc/fun/token-timeout.md | 45 +++++++------- sa-token-doc/start/example.md | 24 ++++---- sa-token-doc/start/solon-example.md | 40 ++++++------- sa-token-doc/use/config.md | 58 +++++++++---------- 8 files changed, 129 insertions(+), 126 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index c1a42b7d..4427a69c 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -19,12 +19,12 @@ public class SaTokenConfig implements Serializable { /** token 名称 (同时也是: cookie 名称、提交 token 时参数的名称、存储 token 时的 key 前缀) */ private String tokenName = "satoken"; - /** token 的长久有效期(单位:秒) 默认30天, -1代表永久 */ + /** token 有效期(单位:秒) 默认30天,-1代表永久 */ private long timeout = 60 * 60 * 24 * 30; /** - * token 临时有效期 [ 指定时间内无操作就视为 token 过期 ] (单位: 秒), 默认-1 代表不限制 - * (例如可以设置为 1800 代表 30 分钟内无操作就过期) + * token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + * (例如可以设置为 1800 代表 30 分钟内无操作就冻结) */ private long activityTimeout = -1; @@ -34,7 +34,7 @@ public class SaTokenConfig implements Serializable { private Boolean isConcurrent = true; /** - * 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + * 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) */ private Boolean isShare = true; @@ -171,14 +171,14 @@ public class SaTokenConfig implements Serializable { } /** - * @return token 的长久有效期(单位:秒) 默认30天, -1代表永久 + * @return token 有效期(单位:秒) 默认30天,-1代表永久 */ public long getTimeout() { return timeout; } /** - * @param timeout token 的长久有效期(单位:秒) 默认30天, -1代表永久 + * @param timeout token 有效期(单位:秒) 默认30天,-1代表永久 * @return 对象自身 */ public SaTokenConfig setTimeout(long timeout) { @@ -187,16 +187,16 @@ public class SaTokenConfig implements Serializable { } /** - * @return token 临时有效期 [ 指定时间内无操作就视为 token 过期 ] (单位: 秒), 默认-1 代表不限制 - * (例如可以设置为 1800 代表 30 分钟内无操作就过期) + * @return token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + * (例如可以设置为 1800 代表 30 分钟内无操作就冻结) */ public long getActivityTimeout() { return activityTimeout; } /** - * @param activityTimeout token 临时有效期 [ 指定时间内无操作就视为 token 过期 ] (单位: 秒), 默认-1 代表不限制 - * (例如可以设置为 1800 代表 30 分钟内无操作就过期) + * @param activityTimeout token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + * (例如可以设置为 1800 代表 30 分钟内无操作就冻结) * @return 对象自身 */ public SaTokenConfig setActivityTimeout(long activityTimeout) { diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java b/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java index 30031ed3..100d92fa 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java @@ -74,7 +74,7 @@ public interface SaErrorCode { /** Token已被踢下线 */ int CODE_11015 = 11015; - /** Token已临时过期 */ + /** Token已被冻结 */ int CODE_11016 = 11016; /** 在未集成 sa-token-jwt 插件时调用 getExtra() 抛出异常 */ 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 7873c05b..787a31b6 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 @@ -491,7 +491,7 @@ public class StpLogic { SaStorage storage = SaHolder.getStorage(); storage.delete(splicingKeyJustCreatedSave()); - // 4、清除当前上下文的 [ 临时有效期 check 标记 ] + // 4、清除当前上下文的 [ 活跃度校验 check 标记 ] storage.delete(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY); // 5、清除这个 token 的其它相关信息 @@ -809,7 +809,7 @@ public class StpLogic { } // 7、检查此 token 的最后活跃时间是否已经超过了 activity-timeout 的限制, - // 如果是则代表其已经临时过期,需要抛出:token 已过期 + // 如果是则代表其已被冻结,需要抛出:token 已过期 checkActivityTimeout(tokenValue); // ------ 至此,loginId 已经是一个合法的值,代表当前会话是一个正常的登录状态了 @@ -868,7 +868,7 @@ public class StpLogic { return null; } - // 4、如果根本获取不到这个 token 的最后活跃时间数据,则也视为其:已经临时过期,也返回 null + // 4、如果 token 已被冻结,也返回 null if(getTokenActivityTimeoutByToken(tokenValue) == SaTokenDao.NOT_VALUE_EXPIRE) { return null; } @@ -1239,7 +1239,7 @@ public class StpLogic { } - // ------------------- Activity-Timeout 临时有效期 验证相关 ------------------- + // ------------------- Activity-Timeout token 最低活跃度 验证相关 ------------------- /** * 写入指定 token 的 [ 最后活跃时间 ] 为当前时间戳 @@ -1247,7 +1247,8 @@ public class StpLogic { * @param tokenValue 指定token */ protected void setLastActivityToNow(String tokenValue) { - // 如果提供的 token 或者 全局配置了 [ 永不过期 ], 则立即返回,无需操作 + + // 如果提供的 token 无效,或者配置没有打开 token 活跃度校验, 则立即返回,无需操作 if(SaFoxUtil.isEmpty(tokenValue) || ! isOpenActivityCheck() ) { return; } @@ -1262,7 +1263,8 @@ public class StpLogic { * @param tokenValue 指定 token */ protected void clearLastActivity(String tokenValue) { - // 如果提供的 token 或者 全局配置了 [ 永不过期 ], 则立即返回,无需操作 + + // 如果提供的 token 无效,或者配置没有打开 token 活跃度校验, 则立即返回,无需操作 if(SaFoxUtil.isEmpty(tokenValue) || ! isOpenActivityCheck() ) { return; } @@ -1272,13 +1274,13 @@ public class StpLogic { } /** - * 检查指定token 是否已经 [ 临时过期 ],如果已经过期则抛出异常 + * 检查指定 token 是否已被冻结,如果是则抛出异常 * - * @param tokenValue 指定token + * @param tokenValue 指定 token */ public void checkActivityTimeout(String tokenValue) { - // 如果提供的 token 或者 全局配置了 [ 永不过期 ], 则立即返回,无需操作 + // 如果提供的 token 无效,或者配置没有打开 token 活跃度校验, 则立即返回,无需操作 if(SaFoxUtil.isEmpty(tokenValue) || ! isOpenActivityCheck() ) { return; } @@ -1289,19 +1291,19 @@ public class StpLogic { return; } - // ------------ 下面开始校验这个 token 是否已经 [ 临时过期 ] + // ------------ 下面开始校验这个 token 是否已被冻结 - // 1、获取这个 token 的临时剩余时间 + // 1、获取这个 token 的剩余活跃有效期 long timeout = getTokenActivityTimeoutByToken(tokenValue); - // 2、值为 -1 代表此 token 已经被设置永不过期,无须继续验证 + // 2、值为 -1 代表此 token 已经被设置永不冻结,无须继续验证 if(timeout == SaTokenDao.NEVER_EXPIRE) { // 此句代码含义参考最下面 storage.set(SaTokenConsts.TOKEN_ACTIVITY_TIMEOUT_CHECKED_KEY, true); return; } - // 3、值为 -2 代表已临时过期,此时需要抛出异常 + // 3、值为 -2 代表已被冻结,此时需要抛出异常 if(timeout == SaTokenDao.NOT_VALUE_EXPIRE) { throw NotLoginException.newInstance(loginType, NotLoginException.TOKEN_TIMEOUT, tokenValue).setCode(SaErrorCode.CODE_11016); } @@ -1312,7 +1314,7 @@ public class StpLogic { } /** - * 检查当前 token 是否已经[临时过期],如果已经过期则抛出异常 + * 检查当前 token 是否已被冻结,如果是则抛出异常 */ public void checkActivityTimeout() { checkActivityTimeout(getTokenValue()); @@ -1324,7 +1326,7 @@ public class StpLogic { * @param tokenValue 指定token */ public void updateLastActivityToNow(String tokenValue) { - // 如果提供的 token 或者 全局配置了 [ 永不过期 ], 则立即返回,无需操作 + // 如果提供的 token 无效,或者配置没有打开 token 活跃度校验, 则立即返回,无需操作 if(SaFoxUtil.isEmpty(tokenValue) || ! isOpenActivityCheck() ) { return; } @@ -1336,8 +1338,8 @@ public class StpLogic { /** * 续签当前 token:(将 [最后操作时间] 更新为当前时间戳) *

- * 请注意: 即使 token 已经 [ 临时过期 ] 也可续签成功, - * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可 + * 请注意: 即使 token 已被冻结 也可续签成功, + * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否冻结即可 *

*/ public void updateLastActivityToNow() { @@ -1405,7 +1407,7 @@ public class StpLogic { } /** - * 获取当前 token [ 临时过期 ] 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值) + * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了) * * @return / */ @@ -1414,23 +1416,23 @@ public class StpLogic { } /** - * 获取指定 token [ 临时过期 ] 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值) + * 获取指定 token 剩余活跃有效期:这个 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了) * * @param tokenValue 指定 token * @return / */ public long getTokenActivityTimeoutByToken(String tokenValue) { + // 如果全局配置了永不冻结, 则返回 -1 + if( ! isOpenActivityCheck() ) { + return SaTokenDao.NEVER_EXPIRE; + } + // 如果提供的 token 为 null,则返回 -2 if(SaFoxUtil.isEmpty(tokenValue)) { return SaTokenDao.NOT_VALUE_EXPIRE; } - // 如果全局配置了永不过期, 则返回 -1 - if( ! isOpenActivityCheck() ) { - return SaTokenDao.NEVER_EXPIRE; - } - // ------ 开始查询 // 1、先获取这个 token 的最后活跃时间,13位时间戳 @@ -1448,12 +1450,12 @@ public class StpLogic { long apartSecond = (System.currentTimeMillis() - lastActivityTime) / 1000; // 4、校验这个时间差是否超过了允许的值 - // 计算公式为: 允许的最大时间差 - 实际时间差,判断是否 < 0, 如果是则代表已经临时过期 ,返回-2 + // 计算公式为: 允许的最大时间差 - 实际时间差,判断是否 < 0, 如果是则代表已经被冻结 ,返回-2 long timeout = getConfig().getActivityTimeout() - apartSecond; if(timeout < 0) { return SaTokenDao.NOT_VALUE_EXPIRE; } else { - // 否则代表没过期,返回剩余有效时间 + // 否则代表没冻结,返回剩余有效时间 return timeout; } } @@ -2587,7 +2589,7 @@ public class StpLogic { } /** - * 返回全局配置是否开启了Token 活跃校验 + * 返回全局配置是否开启了 Token 活跃度校验,返回 true 代表已打开,返回 false 代表不打开,此时永不冻结 token * * @return / */ 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 4fa52f39..da7c5b24 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 @@ -478,10 +478,10 @@ public class StpUtil { } - // ------------------- Activity-Timeout 临时有效期 验证相关 ------------------- + // ------------------- Activity-Timeout token 最低活跃度 验证相关 ------------------- /** - * 检查当前 token 是否已经[临时过期],如果已经过期则抛出异常 + * 检查当前 token 是否已被冻结,如果是则抛出异常 */ public static void checkActivityTimeout() { stpLogic.checkActivityTimeout(); @@ -490,8 +490,8 @@ public class StpUtil { /** * 续签当前 token:(将 [最后操作时间] 更新为当前时间戳) *

- * 请注意: 即使 token 已经 [ 临时过期 ] 也可续签成功, - * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否过期即可 + * 请注意: 即使 token 已被冻结 也可续签成功, + * 如果此场景下需要提示续签失败,可在此之前调用 checkActivityTimeout() 强制检查是否冻结即可 *

*/ public static void updateLastActivityToNow() { @@ -529,7 +529,7 @@ public class StpUtil { } /** - * 获取当前 token [ 临时过期 ] 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值) + * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了) * * @return / */ diff --git a/sa-token-doc/fun/token-timeout.md b/sa-token-doc/fun/token-timeout.md index df5b7f27..e5397514 100644 --- a/sa-token-doc/fun/token-timeout.md +++ b/sa-token-doc/fun/token-timeout.md @@ -2,22 +2,22 @@ -Sa-Token 提供两种Token自动过期策略,分别是`timeout`与`activity-timeout`,配置方法如下: +Sa-Token 提供两种 Token 自动过期策略,分别是 `timeout` 与 `activity-timeout`,配置方法如下: ``` yaml sa-token: - # Token 有效期,单位:秒,默认30天, -1代表永不过期 - timeout: 2592000 - # Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限 - activity-timeout: -1 + # token 有效期(单位:秒),默认30天,-1代表永不过期 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + activity-timeout: -1 ``` ``` properties -# Token 有效期,单位:秒,默认30天, -1代表永不过期 +# token 有效期(单位:秒),默认30天,-1代表永不过期 sa-token.timeout=2592000 -# Token 临时有效期 (指定时间内无操作就视为 Token 过期) 单位: 秒,-1代表不设限 +# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 sa-token.activity-timeout=-1 ``` @@ -29,41 +29,41 @@ sa-token.activity-timeout=-1 > 2. 银行为你颁发一张储蓄卡(系统为你颁发一个Token),以后每次存取钱都要带上这张卡(后续每次访问系统都要提交 Token)。 > 3. 银行为这张卡设定两个过期时间: > - 第一个是 `timeout`,代表这张卡的长久有效期,就是指这张卡最长能用多久,假设 `timeout=3年`,那么3年后此卡将被银行删除,想要继续来银行办理业务必须重新办卡(Token 过期后想要访问系统必须重新登录)。 -> - 第二个就是 `activity-timeout`,代表这张卡的临时有效期,就是指这张卡必须每隔多久来银行一次,假设 `activity-timeout=1月` ,你如果超过1月不来办一次业务,银行就将你的卡冻结,列为长期不动户(Token 长期不访问系统,被冻结,但不会被删除)。 +> - 第二个就是 `activity-timeout`,代表这张卡的最低活跃频率限制,就是指这张卡必须每隔多久来银行一次,假设 `activity-timeout=1月` ,你如果超过1月不来办一次业务,银行就将你的卡冻结,列为长期不动户(Token 长期不访问系统,被冻结,但不会被删除)。 > 4. 两个过期策略可以单独配置,也可以同时配置,只要有其中一个有效期超出了范围,这张卡就会变得不可用(两个有效期只要有一个过期了,Token就无法成功访问系统了)。 下面是对两个过期策略的详细解释: ### timeout -1. `timeout`代表Token的长久有效期,单位/秒,例如将其配置为 2592000 (30天),代表在30天后,Token必定过期,无法继续使用 +1. `timeout`代表 Token 的长久有效期,单位/秒,例如将其配置为 2592000 (30天),代表在30天后,Token必定过期,无法继续使用。 2. `timeout`~~无法续签,想要继续使用必须重新登录~~。v1.29.0+ 版本新增续期方法:`StpUtil.renewTimeout(100)`。 -3. `timeout`的值配置为-1后,代表永久有效,不会过期 +3. `timeout`的值配置为-1后,代表永久有效,不会过期。 ### activity-timeout -1. `activity-timeout`代表临时有效期,单位/秒,例如将其配置为 1800 (30分钟),代表用户如果30分钟无操作,则此Token会立即过期 -2. 如果在30分钟内用户有操作,则会再次续签30分钟,用户如果一直操作则会一直续签,直到连续30分钟无操作,Token才会过期 -3. `activity-timeout`的值配置为-1后,代表永久有效,不会过期,此时也无需频繁续签 +1. `activity-timeout`代表最低活跃频率,单位/秒,例如将其配置为 1800 (30分钟),代表用户如果30分钟无操作,则此Token会立即过期(被冻结,但不会删除掉)。 +2. 如果在30分钟内用户有操作,则会再次续签30分钟,用户如果一直操作则会一直续签,直到连续30分钟无操作,Token才会过期。 +3. `activity-timeout`的值配置为-1后,代表永久有效,不会过期,此时也无需频繁续签。 ### 关于activity-timeout的续签 -如果`activity-timeout`配置了大于零的值,Sa-Token 会在登录时开始计时,在每次直接或间接调用`getLoginId()`时进行一次过期检查与续签操作。 +如果`activity-timeout`配置了大于零的值,Sa-Token 会在登录时开始计时,在每次直接或间接调用`getLoginId()`时进行一次冻结检查与续签操作。 此时会有两种情况: -1. 一种是会话无操作时间太长,Token已经过期,此时框架会抛出`NotLoginException`异常(场景值=-3), +1. 一种是会话无操作时间太长,Token已经被冻结,此时框架会抛出`NotLoginException`异常(场景值=-3), 2. 另一种则是会话在`activity-timeout`有效期内通过检查,此时Token可以成功续签 -### 我可以手动续签吗? +### 我可以手动续签 activity-timeout 吗? **可以!** 如果框架的自动续签算法无法满足您的业务需求,你可以进行手动续签,Sa-Token 提供两个API供你操作: -1. `StpUtil.checkActivityTimeout()`: 检查当前Token 是否已经[临时过期],如果已经过期则抛出异常 +1. `StpUtil.checkActivityTimeout()`: 检查当前Token 是否已经被冻结,如果是则抛出异常 2. `StpUtil.updateLastActivityToNow()`: 续签当前Token:(将 [最后操作时间] 更新为当前时间戳) -注意:在手动续签时,即使Token已经 [临时过期] 也可续签成功,如果此场景下需要提示续签失败,可采用先检查再续签的形式保证Token有效性 +注意:在手动续签时,即使 Token 已经被冻结也可续签成功(解冻),如果此场景下需要提示续签失败,可采用先检查再续签的形式保证Token有效性 例如以下代码: ``` java -// 先检查是否已过期 +// 先检查是否已被冻结 StpUtil.checkActivityTimeout(); // 检查通过后继续续签 StpUtil.updateLastActivityToNow(); @@ -79,14 +79,15 @@ StpUtil.stpLogic.updateLastActivityToNow(tokenValue); ``` -### timeout与activity-timeout可以同时使用吗? +### timeout 与 activity-timeout 可以同时使用吗? **可以同时使用!** 两者的认证逻辑彼此独立,互不干扰,可以同时使用。 -### StpUtil 类中哪些公开方法支持临时有效期自动续签? + +### StpUtil 类中哪些公开方法支持临时有效期自动续签 activity-timeout? > 直接或间接获取了当前用户id的方法 (间接调用过 StpLogic.getLoginId() 方法) -| 支持自动续签的方法 | +| 包括但不限于这些: | |---| | StpUtil.checkLogin() | | StpUtil.getLoginId() | diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md index 6352e7e4..b5e267db 100644 --- a/sa-token-doc/start/example.md +++ b/sa-token-doc/start/example.md @@ -55,17 +55,17 @@ server: ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: - # token名称 (同时也是cookie名称) + # token 名称(同时也是 cookie 名称) token-name: satoken - # token有效期,单位s 默认30天, -1代表永不过期 + # token 有效期(单位:秒),默认30天,-1代表永不过期 timeout: 2592000 - # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 activity-timeout: -1 - # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + # 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) is-concurrent: true - # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) is-share: true - # token风格 + # token 风格 token-style: uuid # 是否输出操作日志 is-log: false @@ -78,17 +78,17 @@ server.port=8081 ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## -# token名称 (同时也是cookie名称) +# token名称(同时也是 cookie 名称) sa-token.token-name=satoken -# token有效期,单位s 默认30天, -1代表永不过期 +# token 有效期(单位:秒),默认30天,-1代表永不过期 sa-token.timeout=2592000 -# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 +# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 sa-token.activity-timeout=-1 -# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) +# 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) sa-token.is-concurrent=true -# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) +# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) sa-token.is-share=true -# token风格 +# token 风格 sa-token.token-style=uuid # 是否输出操作日志 sa-token.is-log=false diff --git a/sa-token-doc/start/solon-example.md b/sa-token-doc/start/solon-example.md index e5c5b575..bc502816 100644 --- a/sa-token-doc/start/solon-example.md +++ b/sa-token-doc/start/solon-example.md @@ -60,20 +60,20 @@ server: ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: - # token名称 (同时也是cookie名称) - token-name: satoken - # token有效期,单位s 默认30天, -1代表永不过期 - timeout: 2592000 - # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 - activity-timeout: -1 - # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) - is-concurrent: true - # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) - is-share: true - # token风格 - token-style: uuid - # 是否输出操作日志 - is-log: false + # token 名称(同时也是 cookie 名称) + token-name: satoken + # token 有效期(单位:秒),默认30天,-1代表永不过期 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + activity-timeout: -1 + # 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) + is-share: true + # token 风格 + token-style: uuid + # 是否输出操作日志 + is-log: false ``` @@ -83,17 +83,17 @@ server.port=8081 ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## -# token名称 (同时也是cookie名称) +# token名称(同时也是 cookie 名称) sa-token.token-name=satoken -# token有效期,单位s 默认30天, -1代表永不过期 +# token 有效期(单位:秒),默认30天,-1代表永不过期 sa-token.timeout=2592000 -# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 +# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 sa-token.activity-timeout=-1 -# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) +# 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) sa-token.is-concurrent=true -# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) +# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) sa-token.is-share=true -# token风格 +# token 风格 sa-token.token-style=uuid # 是否输出操作日志 sa-token.is-log=false diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index dd90b2ea..5fdb8cd8 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -12,17 +12,17 @@ ``` yaml ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: - # token名称 (同时也是cookie名称) + # token 名称(同时也是 cookie 名称) token-name: satoken - # token有效期,单位s 默认30天, -1代表永不过期 + # token 有效期(单位:秒),默认30天,-1代表永不过期 timeout: 2592000 - # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 activity-timeout: -1 - # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) + # 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) is-concurrent: true - # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) is-share: true - # token风格 + # token 风格 token-style: uuid # 是否输出操作日志 is-log: false @@ -32,17 +32,17 @@ sa-token: ``` properties ############## Sa-Token 配置 (文档: https://sa-token.cc) ############## -# token名称 (同时也是cookie名称) +# token名称(同时也是 cookie 名称) sa-token.token-name=satoken -# token有效期,单位s 默认30天, -1代表永不过期 +# token 有效期(单位:秒),默认30天,-1代表永不过期 sa-token.timeout=2592000 -# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 +# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 sa-token.activity-timeout=-1 -# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) +# 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) sa-token.is-concurrent=true -# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) +# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) sa-token.is-share=true -# token风格 +# token 风格 sa-token.token-style=uuid # 是否输出操作日志 sa-token.is-log=false @@ -68,12 +68,12 @@ public class SaTokenConfigure { @Primary public SaTokenConfig getSaTokenConfigPrimary() { SaTokenConfig config = new SaTokenConfig(); - config.setTokenName("satoken"); // token名称 (同时也是cookie名称) - config.setTimeout(30 * 24 * 60 * 60); // token有效期,单位s 默认30天 - config.setActivityTimeout(-1); // token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 - config.setIsConcurrent(true); // 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) - config.setIsShare(true); // 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) - config.setTokenStyle("uuid"); // token风格 + config.setTokenName("satoken"); // token 名称(同时也是 cookie 名称) + config.setTimeout(30 * 24 * 60 * 60); // token 有效期(单位:秒),默认30天,-1代表永不过期 + config.setActivityTimeout(-1); // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + config.setIsConcurrent(true); // 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) + config.setIsShare(true); // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) + config.setTokenStyle("uuid"); // token 风格 config.setIsLog(false); // 是否输出操作日志 return config; } @@ -90,12 +90,12 @@ public class SaTokenConfigure { // 此配置会与 application.yml 中的配置合并 (代码配置优先) @Autowired public void configSaToken(SaTokenConfig config) { - config.setTokenName("satoken"); // token名称 (同时也是cookie名称) - config.setTimeout(30 * 24 * 60 * 60); // token有效期,单位s 默认30天 - config.setActivityTimeout(-1); // token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 - config.setIsConcurrent(true); // 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) - config.setIsShare(true); // 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) - config.setTokenStyle("uuid"); // token风格 + config.setTokenName("satoken"); // token 名称(同时也是 cookie 名称) + config.setTimeout(30 * 24 * 60 * 60); // token 有效期(单位:秒),默认30天,-1代表永不过期 + config.setActivityTimeout(-1); // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + config.setIsConcurrent(true); // 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录) + config.setIsShare(true); // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) + config.setTokenStyle("uuid"); // token 风格 config.setIsLog(false); // 是否输出操作日志 } } @@ -115,11 +115,11 @@ public class SaTokenConfigure { | 参数名称 | 类型 | 默认值 | 说明 | | :-------- | :-------- | :-------- | :-------- | | tokenName | String | satoken | Token 名称 (同时也是 Cookie 名称、数据持久化前缀) | -| timeout | long | 2592000 | Token 有效期,单位/秒 默认30天,-1代表永久有效 [参考:token有效期详解](/fun/token-timeout) | -| activityTimeout | long | -1 | Token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒, 默认-1 代表不限制 (例如可以设置为1800代表30分钟内无操作就过期) [参考:token有效期详解](/fun/token-timeout) | +| timeout | long | 2592000 | Token 有效期(单位:秒),默认30天,-1代表永不过期 [参考:token有效期详解](/fun/token-timeout) | +| activityTimeout | long | -1 | Token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结(例如可以设置为1800代表30分钟内无操作就过期) [参考:token有效期详解](/fun/token-timeout) | | isConcurrent | Boolean | true | 是否允许同一账号并发登录 (为 true 时允许一起登录,为 false 时新登录挤掉旧登录) | -| isShare | Boolean | true | 在多人登录同一账号时,是否共用一个token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) | -| maxLoginCount | int | 12 | 同一账号最大登录数量,-1代表不限 (只有在 `isConcurrent=true`, `isShare=false` 时此配置才有效),[详解](/use/config?id=配置项详解:maxlogincount) | +| isShare | Boolean | true | 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token) | +| maxLoginCount | int | 12 | 同一账号最大登录数量,-1代表不限 (只有在 `isConcurrent=true`,`isShare=false` 时此配置才有效),[详解](/use/config?id=配置项详解:maxlogincount) | | maxTryTimes | int | 12 | 在每次创建 Token 时的最高循环次数,用于保证 Token 唯一性(-1=不循环重试,直接使用) | | isReadBody | Boolean | true | 是否尝试从 请求体 里读取 Token | | isReadHeader | Boolean | true | 是否尝试从 header 里读取 Token | @@ -128,7 +128,7 @@ public class SaTokenConfigure { | tokenStyle | String | uuid | token风格, [参考:自定义Token风格](/up/token-style) | | dataRefreshPeriod | int | 30 | 默认数据持久组件实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理 | | tokenSessionCheckLogin | Boolean | true | 获取 `Token-Session` 时是否必须登录 (如果配置为true,会在每次获取 `Token-Session` 时校验是否登录),[详解](/use/config?id=配置项详解:tokenSessionCheckLogin) | -| autoRenew | Boolean | true | 是否打开自动续签 (如果此值为true, 框架会在每次直接或间接调用 `getLoginId()` 时进行一次过期检查与续签操作),[参考:token有效期详解](/fun/token-timeout) | +| autoRenew | Boolean | true | 是否打开自动续签 (如果此值为true,框架会在每次直接或间接调用 `getLoginId()` 时进行一次过期检查与续签操作),[参考:token有效期详解](/fun/token-timeout) | | tokenPrefix | String | null | token前缀,例如填写 `Bearer` 实际传参 `satoken: Bearer xxxx-xxxx-xxxx-xxxx` [参考:自定义Token前缀](/up/token-prefix) | | isPrint | Boolean | true | 是否在初始化配置时打印版本字符画 | | isLog | Boolean | false | 是否打印操作日志 |