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() {