diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
index f58666c9..58142793 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
@@ -18,16 +18,16 @@ public class SaLoginModel {
*/
public String device;
- /**
- * 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
- */
- public Long timeout;
-
/**
* 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
*/
public Boolean isLastingCookie;
+ /**
+ * 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
+ */
+ public Long timeout;
+
/**
* @return device
@@ -45,22 +45,6 @@ public class SaLoginModel {
return this;
}
- /**
- * @return timeout
- */
- public Long getTimeout() {
- return timeout;
- }
-
- /**
- * @param timeout 要设置的 timeout
- * @return 对象自身
- */
- public SaLoginModel setTimeout(long timeout) {
- this.timeout = timeout;
- return this;
- }
-
/**
* @return isLastingCookie
*/
@@ -77,6 +61,22 @@ public class SaLoginModel {
return this;
}
+ /**
+ * @return timeout
+ */
+ public Long getTimeout() {
+ return timeout;
+ }
+
+ /**
+ * @param timeout 要设置的 timeout
+ * @return 对象自身
+ */
+ public SaLoginModel setTimeout(long timeout) {
+ this.timeout = timeout;
+ return this;
+ }
+
/**
* @return cookie时长
@@ -109,12 +109,12 @@ public class SaLoginModel {
if(device == null) {
device = SaTokenConsts.DEFAULT_LOGIN_DEVICE;
}
- if(timeout == null) {
- timeout = config.getTimeout();
- }
if(isLastingCookie == null) {
isLastingCookie = true;
}
+ if(timeout == null) {
+ timeout = config.getTimeout();
+ }
return this;
}
@@ -128,4 +128,15 @@ public class SaLoginModel {
}
+ /**
+ * toString
+ */
+ @Override
+ public String toString() {
+ return "SaLoginModel [device=" + device + ", isLastingCookie=" + isLastingCookie + ", timeout=" + timeout + "]";
+ }
+
+
+
+
}
diff --git a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
index 291f6c3d..ce27d2b5 100644
--- a/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
+++ b/sa-token-demo-springboot/src/main/java/com/pj/test/TestController.java
@@ -238,12 +238,16 @@ public class TestController {
return AjaxJson.getSuccessData("登录成功");
}
-
// 测试 浏览器访问: http://localhost:8081/test/test
@RequestMapping("test")
public AjaxJson test(HttpServletResponse response) {
System.out.println("进来了");
+// StpUtil.setLoginId(10001, new SaLoginModel()
+// .setDevice("PC") // 此次登录的客户端设备标识, 用于[同端互斥登录]时指定此次登录的设备名称
+// .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
+// .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
+// );
return AjaxJson.getSuccess("访问成功");
}
diff --git a/sa-token-doc/doc/_sidebar.md b/sa-token-doc/doc/_sidebar.md
index b57cb967..749db20b 100644
--- a/sa-token-doc/doc/_sidebar.md
+++ b/sa-token-doc/doc/_sidebar.md
@@ -35,6 +35,7 @@
- **附录**
- [未登录场景值](/fun/not-login-scene)
- [token有效期详解](/fun/token-timeout)
+ - [Session模型详解](/fun/session-model)
- [TokenInfo参数详解](/fun/token-info)
diff --git a/sa-token-doc/doc/fun/session-model.md b/sa-token-doc/doc/fun/session-model.md
new file mode 100644
index 00000000..6ab035d0
--- /dev/null
+++ b/sa-token-doc/doc/fun/session-model.md
@@ -0,0 +1,21 @@
+# Session模型详解
+
+---
+
+在`sa-token`中, `Session` 分为三种, 分别是:
+- `User-Session`: 指的是框架为每个`loginId`分配的`Session`
+- `Token-Session`: 指的是框架为每个`token`分配的`Session`
+- `自定义Session`: 指的是以一个`特定的值`作为SessionId,来分配的`Session`
+
+
+User-Session和Token-Session到底有什么不同?下面这张图可以解释两者的区别
+
+
+
+简而言之:
+- `Token-Session` 以token为主,只要token不同,那么对应的Session对象就不同
+- `User-Session` 以UserId为主,只要token指向的UserId一致,那么对应的Session对象就一致
+- `自定义Session` 以特定的key为主,不同key对应不同的Session对象
+
+
+
diff --git a/sa-token-doc/doc/static/kickout.png b/sa-token-doc/doc/static/kickout.png
new file mode 100644
index 00000000..35a2137b
Binary files /dev/null and b/sa-token-doc/doc/static/kickout.png differ
diff --git a/sa-token-doc/doc/static/not-jur.png b/sa-token-doc/doc/static/not-jur.png
new file mode 100644
index 00000000..6426eb0d
Binary files /dev/null and b/sa-token-doc/doc/static/not-jur.png differ
diff --git a/sa-token-doc/doc/static/not-login.png b/sa-token-doc/doc/static/not-login.png
new file mode 100644
index 00000000..a3075b90
Binary files /dev/null and b/sa-token-doc/doc/static/not-login.png differ
diff --git a/sa-token-doc/doc/static/session-model.png b/sa-token-doc/doc/static/session-model.png
new file mode 100644
index 00000000..4e2dfcae
Binary files /dev/null and b/sa-token-doc/doc/static/session-model.png differ
diff --git a/sa-token-doc/doc/use/jur-auth.md b/sa-token-doc/doc/use/jur-auth.md
index 8763a95d..9fea529f 100644
--- a/sa-token-doc/doc/use/jur-auth.md
+++ b/sa-token-doc/doc/use/jur-auth.md
@@ -8,7 +8,9 @@
有,就让你通过。没有?那么禁止访问!
再往底了说,就是每个账号都会拥有一个权限码集合,我来验证这个集合中是否包含指定的权限码
-例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我来验证权 `"user:update"`,则结果就是:**验证失败,禁止访问**
+例如:当前账号拥有权限码集合:`["user:add", "user:delete", "user:get"]`,这时候我来验证权限 `"user:update"`,则其结果就是:**验证失败,禁止访问**
+
+
所以现在问题的核心就是:
1. 如何获取一个账号所拥有的的权限码集合
diff --git a/sa-token-doc/doc/use/kick.md b/sa-token-doc/doc/use/kick.md
index ba6b4b3d..1651e4e0 100644
--- a/sa-token-doc/doc/use/kick.md
+++ b/sa-token-doc/doc/use/kick.md
@@ -1,6 +1,8 @@
# 踢人下线
所谓踢人下线,核心操作就是找到其指定`loginId`对应的`token`,并设置其失效
+
+
---
diff --git a/sa-token-doc/doc/use/login-auth.md b/sa-token-doc/doc/use/login-auth.md
index 08959c94..fc8725a0 100644
--- a/sa-token-doc/doc/use/login-auth.md
+++ b/sa-token-doc/doc/use/login-auth.md
@@ -7,6 +7,7 @@
所谓登录验证,说白了就是限制某些接口只有登录后才能访问(如:查询我的账号资料)
那么判断一个会话是否登录的依据是什么?当然是登录成功后框架给你做个标记!然后在需要鉴权的接口里检查此标记,有标记者视为已登录,无标记者视为未登录!
+
### 登录与注销
diff --git a/sa-token-doc/doc/use/remember-me.md b/sa-token-doc/doc/use/remember-me.md
index 540501fa..3fcbdfe7 100644
--- a/sa-token-doc/doc/use/remember-me.md
+++ b/sa-token-doc/doc/use/remember-me.md
@@ -59,4 +59,23 @@ Remember me, it's too easy!
+### 登录时指定token有效期
+登录时不仅可以指定是否为`[记住我]`模式,还可以指定一个特定的时间作为token有效时长,如下示例:
+``` java
+// 示例1:
+// 指定token有效期(单位: 秒),如下所示token七天有效
+StpUtil.setLoginId(10001, new SaLoginModel().setTimeout(60 * 60 * 24 * 7));
+
+// ----------------------- 示例2:所有参数
+// `SaLoginModel`为登录参数Model,其有诸多参数决定登录时的各种逻辑,例如:
+StpUtil.setLoginId(10001, new SaLoginModel()
+ .setDevice("PC") // 此次登录的客户端设备标识, 用于[同端互斥登录]时指定此次登录的设备名称
+ .setIsLastingCookie(true) // 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
+ .setTimeout(60 * 60 * 24 * 7) // 指定此次登录token的有效期, 单位:秒 (如未指定,自动取全局配置的timeout值)
+ );
+```
+
+
+
+
diff --git a/sa-token-doc/doc/use/session.md b/sa-token-doc/doc/use/session.md
index c3f86ef4..4d8fc60c 100644
--- a/sa-token-doc/doc/use/session.md
+++ b/sa-token-doc/doc/use/session.md
@@ -9,6 +9,8 @@ Session是会话中专业的数据缓存组件,通过`Session`我们可以很
- `Token-Session`: 指的是框架为每个`token`分配的`Session`
- `自定义Session`: 指的是以一个`特定的值`作为SessionId,来分配的`Session`
+> 有关User-Session与Token-Session的详细区别,请参考:[Session模型详解](/fun/session-model)
+
### User-Session
有关账号Session的API如下: