Files
sa-token/sa-token-dao-redis/src/main/java/cn/dev33/satoken/dao/SaTokenDaoRedis.java

139 lines
3.3 KiB
Java
Raw Normal View History

package cn.dev33.satoken.dao;
2020-02-05 00:31:51 +08:00
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
2020-02-17 23:54:18 +08:00
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
2020-02-05 00:31:51 +08:00
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
2020-02-05 00:31:51 +08:00
import cn.dev33.satoken.session.SaSession;
/**
* sa-token持久层的实现类, 基于redis
2020-02-05 00:31:51 +08:00
*/
@Component
2020-02-05 00:31:51 +08:00
public class SaTokenDaoRedis implements SaTokenDao {
/**
* string专用
*/
2020-02-05 00:31:51 +08:00
@Autowired
StringRedisTemplate stringRedisTemplate;
/**
* SaSession专用
*/
2020-02-05 00:31:51 +08:00
RedisTemplate<String, SaSession> redisTemplate;
@Autowired
@SuppressWarnings({ "rawtypes", "unchecked" })
public void setRedisTemplate(RedisTemplate redisTemplate) {
2020-05-02 15:19:55 +08:00
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
2020-02-05 00:31:51 +08:00
this.redisTemplate = redisTemplate;
}
/**
* 根据key获取value如果没有则返回空
*/
2020-02-05 00:31:51 +08:00
@Override
public String getValue(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
/**
* 写入指定key-value键值对并设定过期时间(单位)
*/
2020-02-05 00:31:51 +08:00
@Override
public void setValue(String key, String value, long timeout) {
// 判断是否为永不过期
if(timeout == SaTokenDao.NEVER_EXPIRE) {
stringRedisTemplate.opsForValue().set(key, value);
} else {
stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
2020-02-05 00:31:51 +08:00
}
/**
* 根据key获取value如果没有则返回空
*/
@Override
public void updateValue(String key, String value) {
long expire = getTimeout(key);
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键
return;
}
this.setValue(key, value, expire);
}
/**
* 根据key获取value如果没有则返回空
*/
2020-02-05 00:31:51 +08:00
@Override
public void deleteKey(String key) {
2020-02-05 00:31:51 +08:00
stringRedisTemplate.delete(key);
}
/**
* 根据key获取value如果没有则返回空
*/
@Override
public long getTimeout(String key) {
return stringRedisTemplate.getExpire(key);
}
/**
* 根据指定key的Session如果没有则返回空
*/
2020-02-05 00:31:51 +08:00
@Override
public SaSession getSession(String sessionId) {
2020-02-05 00:31:51 +08:00
return redisTemplate.opsForValue().get(sessionId);
}
/**
* 将指定Session持久化
*/
2020-02-05 00:31:51 +08:00
@Override
public void saveSession(SaSession session, long timeout) {
// 判断是否为永不过期
if(timeout == SaTokenDao.NEVER_EXPIRE) {
redisTemplate.opsForValue().set(session.getId(), session);
} else {
redisTemplate.opsForValue().set(session.getId(), session, timeout, TimeUnit.SECONDS);
}
2020-02-05 00:31:51 +08:00
}
/**
* 更新指定session
*/
2020-02-05 00:31:51 +08:00
@Override
public void updateSession(SaSession session) {
long expire = getSessionTimeout(session.getId());
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键
2020-02-05 00:31:51 +08:00
return;
}
this.saveSession(session, expire);
2020-02-05 00:31:51 +08:00
}
/**
* 删除一个指定的session
*/
2020-02-05 00:31:51 +08:00
@Override
public void deleteSession(String sessionId) {
2020-02-05 00:31:51 +08:00
redisTemplate.delete(sessionId);
}
/**
* 获取指定SaSession的剩余存活时间 (单位: )
*/
@Override
public long getSessionTimeout(String sessionId) {
return redisTemplate.getExpire(sessionId);
}
2020-02-05 00:31:51 +08:00
}