!119 添加 sa-token-dao-redisx 插件(无 Spring 依赖)

Merge pull request !119 from 西东/dev
This commit is contained in:
省长 2022-03-31 03:56:10 +00:00 committed by Gitee
commit 072e3a5217
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
9 changed files with 283 additions and 2 deletions

View File

@ -18,7 +18,7 @@
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-web</artifactId>
<version>1.6.29</version>
<version>1.6.34</version>
</dependency>
<!-- Sa-Token 权限认证, 在线文档http://sa-token.dev33.cn/ -->

View File

@ -20,6 +20,7 @@
<module>sa-token-alone-redis</module>
<module>sa-token-dao-redis</module>
<module>sa-token-dao-redis-jackson</module>
<module>sa-token-dao-redisx</module>
<module>sa-token-dialect-thymeleaf</module>
<module>sa-token-oauth2</module>
<module>sa-token-quick-login</module>

View File

@ -0,0 +1,41 @@
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-plugin</artifactId>
<version>1.29.1.trial</version>
</parent>
<packaging>jar</packaging>
<name>sa-token-dao-redisx</name>
<artifactId>sa-token-dao-redisx</artifactId>
<description>sa-token integrate redis</description>
<dependencies>
<!-- sa-token-spring-boot-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
<version>${sa-token-version}</version>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>redisx</artifactId>
<version>1.3.4</version>
</dependency>
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-test</artifactId>
<version>1.6.34</version>
</dependency>
</dependencies>
</project>

View File

@ -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<String> searchData(String prefix, String keyword, int start, int size) {
Set<String> keys = redisBucket.keys(prefix + "*" + keyword + "*");
List<String> list = new ArrayList<String>(keys);
return SaFoxUtil.searchList(list, start, size);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -0,0 +1,10 @@
sa-token-dao: #名字可以随意取
redis:
server: "localhost:6379"
password: 123456
db: 1
maxTotal: 200

View File

@ -19,7 +19,7 @@
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon</artifactId>
<version>1.6.29</version>
<version>1.6.34</version>
</dependency>
<dependency>

View File

@ -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();