From 54bf228ec9a88664fea251b3a5a5a81d2225bacd Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Thu, 20 Feb 2025 19:33:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20SaTokenDao=20?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=8B=86=E5=88=86=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E4=B8=8E=E5=BA=8F=E5=88=97=E5=8C=96=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/dao/SaTokenDao.java | 36 ++++-- .../main/java/com/pj/test/TestController.java | 9 +- .../satoken/dao/SaTokenDaoRedisJackson.java | 112 +++--------------- .../spring/json/SaJsonTemplateForJackson.java | 7 ++ 4 files changed, 60 insertions(+), 104 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java index 571b9874..8cb3f6ea 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java @@ -15,6 +15,7 @@ */ package cn.dev33.satoken.dao; +import cn.dev33.satoken.SaManager; import cn.dev33.satoken.session.SaSession; import java.util.List; @@ -90,45 +91,62 @@ public interface SaTokenDao { /** * 获取 Object,如无返空 - * @param key 键名称 + * + * @param key 键名称 * @return object */ - Object getObject(String key); + default Object getObject(String key) { + String jsonString = get(key); + return SaManager.getSaJsonTemplate().jsonToObject(jsonString); + } /** * 写入 Object,并设定存活时间 (单位: 秒) - * @param key 键名称 - * @param object 值 + * + * @param key 键名称 + * @param object 值 * @param timeout 存活时间(值大于0时限时存储,值=-1时永久存储,值=0或小于-2时不存储) */ - void setObject(String key, Object object, long timeout); + default void setObject(String key, Object object, long timeout) { + String jsonString = SaManager.getSaJsonTemplate().objectToJson(object); + set(key, jsonString, timeout); + } /** * 更新 Object (过期时间不变) * @param key 键名称 * @param object 值 */ - void updateObject(String key, Object object); + default void updateObject(String key, Object object) { + String jsonString = SaManager.getSaJsonTemplate().objectToJson(object); + update(key, jsonString); + } /** * 删除 Object * @param key 键名称 */ - void deleteObject(String key); + default void deleteObject(String key) { + delete(key); + } /** * 获取 Object 的剩余存活时间 (单位: 秒) * @param key 指定 key * @return 这个 key 的剩余存活时间 */ - long getObjectTimeout(String key); + default long getObjectTimeout(String key) { + return getTimeout(key); + } /** * 修改 Object 的剩余存活时间(单位: 秒) * @param key 指定 key * @param timeout 剩余存活时间 */ - void updateObjectTimeout(String key, long timeout); + default void updateObjectTimeout(String key, long timeout) { + updateTimeout(key, timeout); + } // --------------------- SaSession 读写 (默认复用 Object 读写方法) --------------------- diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java index 86e59bc5..833b1e20 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/test/TestController.java @@ -7,6 +7,7 @@ import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaResult; +import com.pj.model.SysUser; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -35,7 +36,13 @@ public class TestController { System.out.println("------------进来了 " + SaFoxUtil.formatDate(new Date())); // StpUtil.getLoginId(); // StpUtil.getAnonTokenSession(); - StpUtil.setTokenValue("xxx"); +// StpUtil.setTokenValue("xxx"); + StpUtil.getSession().set("name", "zhang"); + StpUtil.getSession().set("age", 18); + SysUser user = new SysUser(10001, "lisi", 22); + StpUtil.getSession().set("user", user); + StpUtil.getTokenSession().set("user", user); + // 返回 return SaResult.data(null); } diff --git a/sa-token-plugin/sa-token-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java b/sa-token-plugin/sa-token-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java index 83ca2383..60084954 100644 --- a/sa-token-plugin/sa-token-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java +++ b/sa-token-plugin/sa-token-redis-jackson/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedisJackson.java @@ -15,24 +15,8 @@ */ package cn.dev33.satoken.dao; -import java.lang.reflect.Field; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.stereotype.Component; - +import cn.dev33.satoken.strategy.SaStrategy; +import cn.dev33.satoken.util.SaFoxUtil; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @@ -42,9 +26,23 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; -import cn.dev33.satoken.strategy.SaStrategy; -import cn.dev33.satoken.util.SaFoxUtil; +import java.lang.reflect.Field; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; /** * Sa-Token 持久层实现 [ Redis存储、Jackson序列化 ] @@ -225,80 +223,6 @@ public class SaTokenDaoRedisJackson implements SaTokenDao { } stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS); } - - - - /** - * 获取Object,如无返空 - */ - @Override - public Object getObject(String key) { - return objectRedisTemplate.opsForValue().get(key); - } - - /** - * 写入Object,并设定存活时间 (单位: 秒) - */ - @Override - public void setObject(String key, Object object, long timeout) { - if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { - return; - } - // 判断是否为永不过期 - if(timeout == SaTokenDao.NEVER_EXPIRE) { - objectRedisTemplate.opsForValue().set(key, object); - } else { - objectRedisTemplate.opsForValue().set(key, object, timeout, TimeUnit.SECONDS); - } - } - - /** - * 更新Object (过期时间不变) - */ - @Override - public void updateObject(String key, Object object) { - long expire = getObjectTimeout(key); - // -2 = 无此键 - if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { - return; - } - this.setObject(key, object, expire); - } - - /** - * 删除Object - */ - @Override - public void deleteObject(String key) { - objectRedisTemplate.delete(key); - } - - /** - * 获取Object的剩余存活时间 (单位: 秒) - */ - @Override - public long getObjectTimeout(String key) { - return objectRedisTemplate.getExpire(key); - } - - /** - * 修改Object的剩余存活时间 (单位: 秒) - */ - @Override - public void updateObjectTimeout(String key, long timeout) { - // 判断是否想要设置为永久 - if(timeout == SaTokenDao.NEVER_EXPIRE) { - long expire = getObjectTimeout(key); - if(expire == SaTokenDao.NEVER_EXPIRE) { - // 如果其已经被设置为永久,则不作任何处理 - } else { - // 如果尚未被设置为永久,那么再次set一次 - this.setObject(key, this.getObject(key), timeout); - } - return; - } - objectRedisTemplate.expire(key, timeout, TimeUnit.SECONDS); - } /** diff --git a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/json/SaJsonTemplateForJackson.java b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/json/SaJsonTemplateForJackson.java index 4233c377..c5394fd0 100644 --- a/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/json/SaJsonTemplateForJackson.java +++ b/sa-token-starter/sa-token-spring-boot-autoconfig/src/main/java/cn/dev33/satoken/spring/json/SaJsonTemplateForJackson.java @@ -18,6 +18,7 @@ package cn.dev33.satoken.spring.json; import cn.dev33.satoken.error.SaSpringBootErrorCode; import cn.dev33.satoken.exception.SaJsonConvertException; import cn.dev33.satoken.json.SaJsonTemplate; +import cn.dev33.satoken.util.SaFoxUtil; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -81,6 +82,9 @@ public class SaJsonTemplateForJackson implements SaJsonTemplate { */ @Override public Object jsonToObject(String jsonStr) { + if(SaFoxUtil.isEmpty(jsonStr)) { + return null; + } try { Object value = objectMapper.readValue(jsonStr, Object.class); return value; @@ -94,6 +98,9 @@ public class SaJsonTemplateForJackson implements SaJsonTemplate { */ @Override public Map jsonToMap(String jsonStr) { + if(SaFoxUtil.isEmpty(jsonStr)) { + return null; + } try { @SuppressWarnings("unchecked") Map map = objectMapper.readValue(jsonStr, Map.class);