diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml index 74b83b85..21fde390 100644 --- a/sa-token-demo/sa-token-demo-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-solon/pom.xml @@ -18,7 +18,7 @@ org.noear solon-web - 1.6.29 + 1.6.34 diff --git a/sa-token-plugin/pom.xml b/sa-token-plugin/pom.xml index e83f9add..7c16cae2 100644 --- a/sa-token-plugin/pom.xml +++ b/sa-token-plugin/pom.xml @@ -20,6 +20,7 @@ sa-token-alone-redis sa-token-dao-redis sa-token-dao-redis-jackson + sa-token-dao-redisx sa-token-dialect-thymeleaf sa-token-oauth2 sa-token-quick-login diff --git a/sa-token-plugin/sa-token-dao-redisx/pom.xml b/sa-token-plugin/sa-token-dao-redisx/pom.xml new file mode 100644 index 00000000..9dfffe5d --- /dev/null +++ b/sa-token-plugin/sa-token-dao-redisx/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + + + cn.dev33 + sa-token-plugin + 1.29.1.trial + + jar + + sa-token-dao-redisx + sa-token-dao-redisx + sa-token integrate redis + + + + + cn.dev33 + sa-token-core + ${sa-token-version} + + + + org.noear + redisx + 1.3.4 + + + + org.noear + solon-test + 1.6.34 + + + + + + diff --git a/sa-token-plugin/sa-token-dao-redisx/src/main/java/cn/dev33/satoken/dao/SaTokenDaoOfRedis.java b/sa-token-plugin/sa-token-dao-redisx/src/main/java/cn/dev33/satoken/dao/SaTokenDaoOfRedis.java new file mode 100644 index 00000000..34572a56 --- /dev/null +++ b/sa-token-plugin/sa-token-dao-redisx/src/main/java/cn/dev33/satoken/dao/SaTokenDaoOfRedis.java @@ -0,0 +1,185 @@ +package cn.dev33.satoken.dao; + +import cn.dev33.satoken.util.SaFoxUtil; +import org.noear.redisx.RedisClient; +import org.noear.redisx.plus.RedisBucket; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +/** + * SaTokenDao 的 redis 适配(相对于之前的 redis 适配;主要去除去 Spring 的依赖) + * + * @author noear + * @since 2022-03-30 + */ +public class SaTokenDaoOfRedis implements SaTokenDao { + private final RedisBucket redisBucket; + + public SaTokenDaoOfRedis(Properties props) { + this(new RedisClient(props)); + } + + public SaTokenDaoOfRedis(RedisClient redisClient) { + redisBucket = redisClient.getBucket(); + } + + + /** + * 获取Value,如无返空 + */ + @Override + public String get(String key) { + return redisBucket.get(key); + } + + /** + * 写入Value,并设定存活时间 (单位: 秒) + */ + @Override + public void set(String key, String value, long timeout) { + if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + // 判断是否为永不过期 + if (timeout == SaTokenDao.NEVER_EXPIRE) { + redisBucket.store(key, value, (int) SaTokenDao.NEVER_EXPIRE); + } else { + redisBucket.store(key, value, (int) timeout); + } + } + + /** + * 修改指定key-value键值对 (过期时间不变) + */ + @Override + public void update(String key, String value) { + long expire = getTimeout(key); + // -2 = 无此键 + if (expire == SaTokenDao.NOT_VALUE_EXPIRE) { + return; + } + this.set(key, value, expire); + } + + /** + * 删除Value + */ + @Override + public void delete(String key) { + redisBucket.remove(key); + } + + /** + * 获取Value的剩余存活时间 (单位: 秒) + */ + @Override + public long getTimeout(String key) { + return redisBucket.ttl(key); + } + + /** + * 修改Value的剩余存活时间 (单位: 秒) + */ + @Override + public void updateTimeout(String key, long timeout) { + // 判断是否想要设置为永久 + if (timeout == SaTokenDao.NEVER_EXPIRE) { + long expire = getTimeout(key); + if (expire == SaTokenDao.NEVER_EXPIRE) { + // 如果其已经被设置为永久,则不作任何处理 + } else { + // 如果尚未被设置为永久,那么再次set一次 + this.set(key, this.get(key), timeout); + } + return; + } + redisBucket.delay(key, (int) timeout); + } + + + /** + * 获取Object,如无返空 + */ + @Override + public Object getObject(String key) { + return redisBucket.getAndDeserialize(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) { + redisBucket.storeAndSerialize(key, object); + } else { + redisBucket.storeAndSerialize(key, object, (int) timeout); + } + } + + /** + * 更新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) { + redisBucket.remove(key); + } + + /** + * 获取Object的剩余存活时间 (单位: 秒) + */ + @Override + public long getObjectTimeout(String key) { + return redisBucket.ttl(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; + } + redisBucket.delay(key, (int) timeout); + } + + + /** + * 搜索数据 + */ + @Override + public List searchData(String prefix, String keyword, int start, int size) { + Set keys = redisBucket.keys(prefix + "*" + keyword + "*"); + List list = new ArrayList(keys); + return SaFoxUtil.searchList(list, start, size); + } +} \ No newline at end of file diff --git a/sa-token-plugin/sa-token-dao-redisx/src/test/java/demo/App.java b/sa-token-plugin/sa-token-dao-redisx/src/test/java/demo/App.java new file mode 100644 index 00000000..ac68f579 --- /dev/null +++ b/sa-token-plugin/sa-token-dao-redisx/src/test/java/demo/App.java @@ -0,0 +1,12 @@ +package demo; + +import org.noear.solon.Solon; + +/** + * @author noear 2022/3/30 created + */ +public class App { + public static void main(String[] args) { + Solon.start(App.class, args); + } +} diff --git a/sa-token-plugin/sa-token-dao-redisx/src/test/java/demo/Config.java b/sa-token-plugin/sa-token-dao-redisx/src/test/java/demo/Config.java new file mode 100644 index 00000000..41f34b5c --- /dev/null +++ b/sa-token-plugin/sa-token-dao-redisx/src/test/java/demo/Config.java @@ -0,0 +1,27 @@ +package demo; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.dao.SaTokenDao; +import cn.dev33.satoken.dao.SaTokenDaoOfRedis; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Inject; + +/** + * @author noear 2022/3/30 created + */ +@Configuration +public class Config { + @Bean + public void saTokenDaoInit(@Inject("${sa-token-dao.redis}") SaTokenDaoOfRedis saTokenDao) { + //手动操作,可适用于任何框架 + SaManager.setSaTokenDao(saTokenDao); + } + + + @Bean + public SaTokenDao saTokenDaoInit2(@Inject("${sa-token-dao.redis}") SaTokenDaoOfRedis saTokenDao) { + //Solon 项目,可用此案 + return saTokenDao; + } +} diff --git a/sa-token-plugin/sa-token-dao-redisx/src/test/resources/app.yml b/sa-token-plugin/sa-token-dao-redisx/src/test/resources/app.yml new file mode 100644 index 00000000..3e45af02 --- /dev/null +++ b/sa-token-plugin/sa-token-dao-redisx/src/test/resources/app.yml @@ -0,0 +1,10 @@ + + + + +sa-token-dao: #名字可以随意取 + redis: + server: "localhost:6379" + password: 123456 + db: 1 + maxTotal: 200 diff --git a/sa-token-starter/sa-token-solon-plugin/pom.xml b/sa-token-starter/sa-token-solon-plugin/pom.xml index 654a8365..1a395879 100644 --- a/sa-token-starter/sa-token-solon-plugin/pom.xml +++ b/sa-token-starter/sa-token-solon-plugin/pom.xml @@ -19,7 +19,7 @@ org.noear solon - 1.6.29 + 1.6.34 diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java index ab4e878c..cca7fd1c 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java @@ -53,6 +53,11 @@ public class XPluginImp implements Plugin { // 注入上下文Bean SaManager.setSaTokenContext(new SaContextForSolon()); + // 注入Dao Bean + Aop.getAsyn(SaTokenDao.class, bw -> { + SaManager.setSaTokenDao(bw.raw()); + }); + // 注入二级上下文 Bean Aop.getAsyn(SaTokenSecondContextCreator.class, bw->{ SaTokenSecondContextCreator raw = bw.raw();