diff --git a/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java b/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java index 100ea6a8..c051783a 100644 --- a/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java +++ b/sa-token-plugin/sa-token-alone-redis/src/main/java/cn/dev33/satoken/dao/alone/SaAloneRedisInject.java @@ -19,7 +19,7 @@ import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDaoDefaultImpl; import cn.dev33.satoken.dao.SaTokenDaoRedisFastjson; import cn.dev33.satoken.dao.SaTokenDaoRedisFastjson2; -import cn.dev33.satoken.dao.impl.SaTokenDaoForRedisTemplate; +import cn.dev33.satoken.dao.SaTokenDaoForRedisTemplate; import cn.dev33.satoken.exception.SaTokenException; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.annotation.Autowired; diff --git a/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplate.java similarity index 55% rename from sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java rename to sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplate.java index a91fe362..b8ba5692 100644 --- a/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java +++ b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplate.java @@ -15,39 +15,27 @@ */ package cn.dev33.satoken.dao; +import cn.dev33.satoken.dao.auto.SaTokenDaoByObjectFollowStringUseJsonSerializer; +import cn.dev33.satoken.util.SaFoxUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.StringRedisTemplate; + 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.JdkSerializationRedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.stereotype.Component; - -import cn.dev33.satoken.util.SaFoxUtil; - /** - * Sa-Token 持久层实现 [ Redis存储、JDK默认序列化 ] + * Sa-Token 持久层实现 [ RedisTemplate 存储 ] (可用环境: SpringBoot2、SpringBoot3) + *
copy by: sa-token-redis-template 插件 * * @author click33 * @since 1.34.0 */ -@Component -public class SaTokenDaoRedis implements SaTokenDao { +public class SaTokenDaoForRedisTemplate implements SaTokenDaoByObjectFollowStringUseJsonSerializer { - /** - * String 读写专用 - */ - public StringRedisTemplate stringRedisTemplate; - - /** - * Object 读写专用 - */ - public RedisTemplate objectRedisTemplate; + public StringRedisTemplate stringRedisTemplate; /** * 标记:当前 redis 连接信息是否已初始化成功 @@ -60,34 +48,24 @@ public class SaTokenDaoRedis implements SaTokenDao { if(this.isInit) { return; } - - // 指定相应的序列化方案 - StringRedisSerializer keySerializer = new StringRedisSerializer(); - JdkSerializationRedisSerializer valueSerializer = new JdkSerializationRedisSerializer(); // 构建StringRedisTemplate StringRedisTemplate stringTemplate = new StringRedisTemplate(); stringTemplate.setConnectionFactory(connectionFactory); stringTemplate.afterPropertiesSet(); - - // 构建RedisTemplate - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(connectionFactory); - template.setKeySerializer(keySerializer); - template.setHashKeySerializer(keySerializer); - template.setValueSerializer(valueSerializer); - template.setHashValueSerializer(valueSerializer); - template.afterPropertiesSet(); - - // 开始初始化相关组件 this.stringRedisTemplate = stringTemplate; - this.objectRedisTemplate = template; + + initMore(connectionFactory); // 打上标记,表示已经初始化成功,后续无需再重新初始化 this.isInit = true; } - - + + protected void initMore(RedisConnectionFactory connectionFactory) { + + } + + /** * 获取Value,如无返空 */ @@ -159,79 +137,6 @@ public class SaTokenDaoRedis 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-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplateUseJdkSerializer.java b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplateUseJdkSerializer.java new file mode 100644 index 00000000..f7a4e064 --- /dev/null +++ b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplateUseJdkSerializer.java @@ -0,0 +1,130 @@ +/* + * Copyright 2020-2099 sa-token.cc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package cn.dev33.satoken.dao; + +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.util.concurrent.TimeUnit; + +/** + * Sa-Token 持久层实现 [ RedisTemplate 存储、JDK默认序列化 ] (可用环境: SpringBoot2、SpringBoot3) + * + * @author click33 + * @since 1.34.0 + */ +public class SaTokenDaoForRedisTemplateUseJdkSerializer extends SaTokenDaoForRedisTemplate { + + /** + * Object 读写专用 + */ + public RedisTemplate objectRedisTemplate; + + @Override + protected void initMore(RedisConnectionFactory connectionFactory) { + + // 指定相应的序列化方案 + StringRedisSerializer keySerializer = new StringRedisSerializer(); + JdkSerializationRedisSerializer valueSerializer = new JdkSerializationRedisSerializer(); + + // 构建RedisTemplate + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + template.setKeySerializer(keySerializer); + template.setHashKeySerializer(keySerializer); + template.setValueSerializer(valueSerializer); + template.setHashValueSerializer(valueSerializer); + template.afterPropertiesSet(); + + } + + + /** + * 获取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-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring.factories b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring.factories index ce5c7e82..c3460937 100644 --- a/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring.factories +++ b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring.factories @@ -1 +1 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.dev33.satoken.dao.SaTokenDaoRedis \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.dev33.satoken.dao.SaTokenDaoForRedisTemplateUseJdkSerializer \ No newline at end of file diff --git a/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 225469e7..8518af0a 100644 --- a/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/sa-token-plugin/sa-token-redis-template-jdk-serializer/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -cn.dev33.satoken.dao.SaTokenDaoRedis \ No newline at end of file +cn.dev33.satoken.dao.SaTokenDaoForRedisTemplateUseJdkSerializer \ No newline at end of file diff --git a/sa-token-plugin/sa-token-redis-template/src/main/java/cn/dev33/satoken/dao/impl/SaTokenDaoForRedisTemplate.java b/sa-token-plugin/sa-token-redis-template/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplate.java similarity index 96% rename from sa-token-plugin/sa-token-redis-template/src/main/java/cn/dev33/satoken/dao/impl/SaTokenDaoForRedisTemplate.java rename to sa-token-plugin/sa-token-redis-template/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplate.java index a0c92938..c2e9fef7 100644 --- a/sa-token-plugin/sa-token-redis-template/src/main/java/cn/dev33/satoken/dao/impl/SaTokenDaoForRedisTemplate.java +++ b/sa-token-plugin/sa-token-redis-template/src/main/java/cn/dev33/satoken/dao/SaTokenDaoForRedisTemplate.java @@ -13,15 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package cn.dev33.satoken.dao.impl; +package cn.dev33.satoken.dao; -import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.auto.SaTokenDaoByObjectFollowStringUseJsonSerializer; import cn.dev33.satoken.util.SaFoxUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @@ -34,7 +32,6 @@ import java.util.concurrent.TimeUnit; * @author click33 * @since 1.34.0 */ -@Component public class SaTokenDaoForRedisTemplate implements SaTokenDaoByObjectFollowStringUseJsonSerializer { public StringRedisTemplate stringRedisTemplate; @@ -57,11 +54,17 @@ public class SaTokenDaoForRedisTemplate implements SaTokenDaoByObjectFollowStrin stringTemplate.afterPropertiesSet(); this.stringRedisTemplate = stringTemplate; + initMore(connectionFactory); + // 打上标记,表示已经初始化成功,后续无需再重新初始化 this.isInit = true; } - - + + protected void initMore(RedisConnectionFactory connectionFactory) { + + } + + /** * 获取Value,如无返空 */ diff --git a/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring.factories b/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring.factories index c895fb4b..78085e76 100644 --- a/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring.factories +++ b/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring.factories @@ -1 +1 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.dev33.satoken.dao.impl.SaTokenDaoForRedisTemplate \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.dev33.satoken.dao.SaTokenDaoForRedisTemplate \ No newline at end of file diff --git a/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 638b0601..6d293f5e 100644 --- a/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/sa-token-plugin/sa-token-redis-template/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -cn.dev33.satoken.dao.impl.SaTokenDaoForRedisTemplate \ No newline at end of file +cn.dev33.satoken.dao.SaTokenDaoForRedisTemplate \ No newline at end of file