diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
index cc350d63..6b142d86 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
@@ -7,6 +7,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
+import cn.dev33.satoken.util.SaFoxUtil;
+
/**
* Sa-Token配置文件的构建工厂类
*
@@ -17,6 +19,9 @@ import java.util.Properties;
*/
public class SaTokenConfigFactory {
+ private SaTokenConfigFactory() {
+ }
+
/**
* 配置文件地址
*/
@@ -101,7 +106,7 @@ public class SaTokenConfigFactory {
continue;
}
try {
- Object valueConvert = getObjectByClass(value, field.getType());
+ Object valueConvert = SaFoxUtil.getValueByType(value, field.getType());
field.setAccessible(true);
field.set(obj, valueConvert);
} catch (IllegalArgumentException | IllegalAccessException e) {
@@ -111,36 +116,4 @@ public class SaTokenConfigFactory {
return obj;
}
- /**
- * 工具方法: 将字符串转化为指定数据类型
- *
- * @param str 值
- * @param cs 要转换的类型
- * @return 转化好的结果
- */
- @SuppressWarnings("unchecked")
- private static T getObjectByClass(String str, Class cs) {
- Object value;
- if (str == null) {
- value = null;
- } else if (cs.equals(String.class)) {
- value = str;
- } else if (cs.equals(int.class) || cs.equals(Integer.class)) {
- value = Integer.valueOf(str);
- } else if (cs.equals(long.class) || cs.equals(Long.class)) {
- value = Long.valueOf(str);
- } else if (cs.equals(short.class) || cs.equals(Short.class)) {
- value = Short.valueOf(str);
- } else if (cs.equals(float.class) || cs.equals(Float.class)) {
- value = Float.valueOf(str);
- } else if (cs.equals(double.class) || cs.equals(Double.class)) {
- value = Double.valueOf(str);
- } else if (cs.equals(boolean.class) || cs.equals(Boolean.class)) {
- value = Boolean.valueOf(str);
- } else {
- throw new RuntimeException("未能将值:" + str + ",转换类型为:" + cs, null);
- }
- return (T) value;
- }
-
}
diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
index 23a9c5d5..1fe670c8 100644
--- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
+++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
@@ -23,6 +23,9 @@ import cn.dev33.satoken.strategy.SaStrategy;
*/
public class SaSessionCustomUtil {
+ private SaSessionCustomUtil() {
+ }
+
/**
* 添加上指定前缀,防止恶意伪造Session
*/
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/config/SaTokenConfigTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/config/SaTokenConfigTest.java
index facef8cf..a26a928c 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/config/SaTokenConfigTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/config/SaTokenConfigTest.java
@@ -86,6 +86,8 @@ public class SaTokenConfigTest {
SaCookieConfig scc = new SaCookieConfig();
config.setCookie(scc);
Assertions.assertEquals(config.getCookie(), scc);
+
+ config.toString();
}
// 从文件读取
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionCustomUtilTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionCustomUtilTest.java
new file mode 100644
index 00000000..9a634aa5
--- /dev/null
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionCustomUtilTest.java
@@ -0,0 +1,52 @@
+package cn.dev33.satoken.core.session;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import cn.dev33.satoken.SaManager;
+import cn.dev33.satoken.dao.SaTokenDao;
+import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.session.SaSessionCustomUtil;
+
+/**
+ * SaSession 测试
+ *
+ * @author kong
+ * @since: 2022-2-9
+ */
+public class SaSessionCustomUtilTest {
+
+ // 测试自定义Session
+ @Test
+ public void testCustomSession() {
+ SaTokenDao dao = SaManager.getSaTokenDao();
+
+ // 刚开始不存在
+ Assertions.assertFalse(SaSessionCustomUtil.isExists("art-1"));
+ SaSession session = dao.getSession("satoken:custom:session:" + "art-1");
+ Assertions.assertNull(session);
+
+ // 调用一下
+ SaSessionCustomUtil.getSessionById("art-1");
+ SaSessionCustomUtil.getSessionById("art-1", false);
+
+ // 就存在了
+ Assertions.assertTrue(SaSessionCustomUtil.isExists("art-1"));
+ SaSession session2 = dao.getSession("satoken:custom:session:" + "art-1");
+ Assertions.assertNotNull(session2);
+
+ // 给删除掉
+ SaSessionCustomUtil.deleteSessionById("art-1");
+
+ // 就又不存在了
+ Assertions.assertFalse(SaSessionCustomUtil.isExists("art-1"));
+ SaSession session3 = dao.getSession("satoken:custom:session:" + "art-1");
+ Assertions.assertNull(session3);
+
+ // 调用了也不会存在
+ SaSessionCustomUtil.getSessionById("art-4", false);
+ SaSession session4 = dao.getSession("satoken:custom:session:" + "art-2");
+ Assertions.assertNull(session4);
+ }
+
+}
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionTest.java
index 1c3e6e79..5cb8d454 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/session/SaSessionTest.java
@@ -1,9 +1,16 @@
package cn.dev33.satoken.core.session;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.session.SaSession;
+import cn.dev33.satoken.session.TokenSign;
/**
* SaSession 测试
@@ -13,12 +20,27 @@ import cn.dev33.satoken.session.SaSession;
*/
public class SaSessionTest {
+ // 基础属性
@Test
- public void test() {
+ public void testProp() {
SaSession session = new SaSession("session-1001");
Assertions.assertEquals(session.getId(), "session-1001");
+
+ // 属性读取
+ session = new SaSession();
+ session.setId("session-1009");
+ Assertions.assertEquals(session.getId(), "session-1009");
+
+ session.setCreateTime(1662241013902L);
+ Assertions.assertEquals(session.getCreateTime(), 1662241013902L);
+ }
+
+ // 基础存取值
+ @Test
+ public void testSetGet() {
// 基础取值
+ SaSession session = new SaSession("session-1002");
session.set("name", "zhangsan");
session.set("age", 18);
Assertions.assertEquals(session.get("name"), "zhangsan");
@@ -26,6 +48,12 @@ public class SaSessionTest {
Assertions.assertEquals((int)session.get("age2", 20), 20);
Assertions.assertEquals(session.getModel("age", Double.class).getClass(), Double.class);
+ // 原本无值时才会写入
+ session.setByNull("name", "lisi");
+ Assertions.assertEquals(session.get("name"), "zhangsan");
+ session.setByNull("name2", "lisi");
+ Assertions.assertEquals(session.get("name2"), "lisi");
+
// 复杂取值
class User {
String name;
@@ -42,17 +70,81 @@ public class SaSessionTest {
Assertions.assertNotNull(user2);
Assertions.assertEquals(user2.name, "zhangsan");
Assertions.assertEquals(user2.age, 18);
+ }
+
+ // 测试有效期
+ @Test
+ public void testSessionTimeout() {
+ // 修改剩余有效期
+ SaSession session = new SaSession("session-1005");
+ SaManager.getSaTokenDao().setSession(session, 20000);
+ session.updateMaxTimeout(100);
+ Assertions.assertTrue(session.getTimeout() <= 100);
+ System.out.println(session.getTimeout());
+ // 仍然是 <=100
+ session.updateMaxTimeout(1000);
+ Assertions.assertTrue(session.getTimeout() <= 100);
+ System.out.println(session.getTimeout());
+ // Min 修改
+ session.updateMinTimeout(-1);
+ System.out.println(session.getTimeout());
+ Assertions.assertTrue(session.getTimeout() == -1);
+ }
+
+ // 测试token 签名
+ @Test
+ public void testTokenSign() {
+ SaSession session = new SaSession("session-1002");
- // Token签名
+ // 添加 Token 签名
session.addTokenSign("xxxx-xxxx-xxxx-xxxx-1", "PC");
session.addTokenSign("xxxx-xxxx-xxxx-xxxx-2", "APP");
+ // 查询
Assertions.assertEquals(session.getTokenSignList().size(), 2);
Assertions.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-1").getDevice(), "PC");
Assertions.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-2").getDevice(), "APP");
+ // 删除一个
session.removeTokenSign("xxxx-xxxx-xxxx-xxxx-1");
Assertions.assertEquals(session.getTokenSignList().size(), 1);
- }
+ // 删除一个不存在的,则不影响 TokenSign 列表
+ session.removeTokenSign("xxxx-xxxx-xxxx-xxxx-999");
+ Assertions.assertEquals(session.getTokenSignList().size(), 1);
+
+ // 重置整个签名列表
+ List list = Arrays.asList(
+ new TokenSign("xxxx-xxxx-xxxx-xxxx-1", "WEB"),
+ new TokenSign("xxxx-xxxx-xxxx-xxxx-2", "phone"),
+ new TokenSign("xxxx-xxxx-xxxx-xxxx-3", "ipad")
+ );
+ session.setTokenSignList(list);
+ Assertions.assertEquals(session.getTokenSignList().size(), 3);
+ Assertions.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-1").getDevice(), "WEB");
+ Assertions.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-2").getDevice(), "phone");
+ Assertions.assertEquals(session.getTokenSign("xxxx-xxxx-xxxx-xxxx-3").getDevice(), "ipad");
+ }
+
+ // 测试重置 DataMap
+ @Test
+ public void testDataMap() {
+ SaSession session = new SaSession("session-1003");
+ session.set("key1", "value1");
+ session.set("key2", "value2");
+ session.set("key3", "value3");
+
+ // 所有数据
+ Assertions.assertEquals(session.keys().size(), 3);
+ Assertions.assertEquals(session.getDataMap().size(), 3);
+
+ // 重置所有数据
+ Map dataMap = new ConcurrentHashMap<>();
+ dataMap.put("aaa", "111");
+ dataMap.put("bbb", "222");
+ session.refreshDataMap(dataMap);
+ Assertions.assertEquals(session.keys().size(), 2);
+
+ }
+
}
diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java
index d89a595e..ed1eb4a7 100644
--- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java
+++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/springboot/BasicsTest.java
@@ -17,7 +17,6 @@ import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
import cn.dev33.satoken.exception.NotSafeException;
import cn.dev33.satoken.session.SaSession;
-import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpLogic;
@@ -315,31 +314,6 @@ public class BasicsTest {
Assertions.assertEquals(tokenSession.getId(), tokenSession2.getId());
}
- // 测试自定义Session
- @Test
- public void testCustomSession() {
- // 刚开始不存在
- Assertions.assertFalse(SaSessionCustomUtil.isExists("art-1"));
- SaSession session = dao.getSession("satoken:custom:session:" + "art-1");
- Assertions.assertNull(session);
-
- // 调用一下
- SaSessionCustomUtil.getSessionById("art-1");
-
- // 就存在了
- Assertions.assertTrue(SaSessionCustomUtil.isExists("art-1"));
- SaSession session2 = dao.getSession("satoken:custom:session:" + "art-1");
- Assertions.assertNotNull(session2);
-
- // 给删除掉
- SaSessionCustomUtil.deleteSessionById("art-1");
-
- // 就又不存在了
- Assertions.assertFalse(SaSessionCustomUtil.isExists("art-1"));
- SaSession session3 = dao.getSession("satoken:custom:session:" + "art-1");
- Assertions.assertNull(session3);
- }
-
// 测试:根据账号id踢人
@Test
public void kickoutByLoginId() {