sa-token/sa-token-doc/doc/use/dao-extend.md

127 lines
3.6 KiB
Markdown
Raw Normal View History

2020-02-06 00:52:49 +08:00
# 持久层扩展
---
2020-09-07 02:21:35 +08:00
- 每次重启项目就得重新登录一遍,我想把登录数据都放在`redis`里,这样重启项目也不用重新登录,行不行?
2020-02-06 00:52:49 +08:00
- 行!
- 你需要做的就是重写`sa-token`的dao层实现方式参考以下方案
2020-12-14 23:01:15 +08:00
### 1. 首先在pom.xml引入依赖
``` xml
<!-- SpringBoot整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>RELEASE</version>
</dependency>
```
### 2. 实现SaTokenDao接口
新建文件`SaTokenDaoRedis.java`,实现接口`SaTokenDao`, 并加上注解`@Component`保证此类被springboot扫描到
2020-02-06 00:52:49 +08:00
- 代码参考:
```java
package com.pj.satoken;
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-06 00:52:49 +08:00
import org.springframework.data.redis.serializer.StringRedisSerializer;
2020-10-03 13:58:04 +08:00
import org.springframework.stereotype.Component;
2020-02-06 00:52:49 +08:00
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.session.SaSession;
/**
* sa-token持久层的实现类 , 基于redis
*/
@Component // 打开此注解保证此类被springboot扫描即可完成sa-token与redis的集成
2020-02-06 00:52:49 +08:00
public class SaTokenDaoRedis implements SaTokenDao {
// string专用
@Autowired
StringRedisTemplate stringRedisTemplate;
// SaSession专用
RedisTemplate<String, SaSession> redisTemplate;
@Autowired
@SuppressWarnings({ "rawtypes", "unchecked" })
public void setRedisTemplate(RedisTemplate redisTemplate) {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
2020-02-06 00:52:49 +08:00
this.redisTemplate = redisTemplate;
}
// 根据key获取value ,如果没有,则返回空
@Override
public String getValue(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
// 写入指定key-value键值对并设定过期时间(单位:秒)
@Override
public void setValue(String key, String value, long timeout) {
stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
// 更新指定key-value键值对 (过期时间取原来的值)
@Override
public void updateValue(String key, String value) {
long expire = redisTemplate.getExpire(key);
if(expire == -2) { // -2 = 无此键
return;
}
stringRedisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
}
2020-02-06 00:52:49 +08:00
// 删除一个指定的key
@Override
public void delKey(String key) {
stringRedisTemplate.delete(key);
}
// 根据指定key的session如果没有则返回空
@Override
public SaSession getSaSession(String sessionId) {
return redisTemplate.opsForValue().get(sessionId);
}
// 将指定session持久化
@Override
public void saveSaSession(SaSession session, long timeout) {
redisTemplate.opsForValue().set(session.getId(), session, timeout, TimeUnit.SECONDS);
}
// 更新指定session
@Override
public void updateSaSession(SaSession session) {
long expire = redisTemplate.getExpire(session.getId());
if(expire == -2) { // -2 = 无此键
return;
}
redisTemplate.opsForValue().set(session.getId(), session, expire, TimeUnit.SECONDS);
}
// 删除一个指定的session
@Override
public void deleteSaSession(String sessionId) {
2020-02-06 00:52:49 +08:00
redisTemplate.delete(sessionId);
}
}
```
- 可参考代码:[码云SaTokenDaoRedis.java](https://gitee.com/sz6/sa-token/blob/master/sa-token-demo-springboot/src/main/java/com/pj/satoken/SaTokenDaoRedis.java)