v1.7.0 新特性,在Cookie模式下timeout过期时间有效

This commit is contained in:
shengzhang
2020-12-23 18:49:22 +08:00
parent 149b2e54c9
commit ded6da5554
12 changed files with 206 additions and 55 deletions

View File

@@ -7,6 +7,7 @@ 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.dao.SaTokenDao;
import cn.dev33.satoken.session.SaSession;
@@ -14,7 +15,7 @@ import cn.dev33.satoken.session.SaSession;
/**
* sa-token持久层的实现类 , 基于redis
*/
//@Component // 打开此注解保证此类被springboot扫描即可完成sa-token与redis的集成
@Component // 打开此注解保证此类被springboot扫描即可完成sa-token与redis的集成
public class SaTokenDaoRedis implements SaTokenDao {
@@ -42,14 +43,19 @@ public class SaTokenDaoRedis implements SaTokenDao {
// 写入指定key-value键值对并设定过期时间(单位:秒)
@Override
public void setValue(String key, String value, long timeout) {
stringRedisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
// 判断是否为永不过期
if(timeout == SaTokenDao.NEVER_EXPIRE) {
stringRedisTemplate.opsForValue().set(key, value);
} else {
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 = 无此键
long expire = getTimeout(key);
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键
return;
}
stringRedisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
@@ -61,24 +67,36 @@ public class SaTokenDaoRedis implements SaTokenDao {
stringRedisTemplate.delete(key);
}
// 获取指定key的剩余存活时间 (单位: 秒)
@Override
public long getTimeout(String key) {
return stringRedisTemplate.getExpire(key);
}
// 根据指定key的session如果没有则返回空
@Override
public SaSession getSaSession(String sessionId) {
public SaSession getSession(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);
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);
}
}
// 更新指定session
@Override
public void updateSaSession(SaSession session) {
long expire = redisTemplate.getExpire(session.getId());
if(expire == -2) { // -2 = 无此键
public void updateSession(SaSession session) {
long expire = getSessionTimeout(session.getId());
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) { // -2 = 无此键
return;
}
redisTemplate.opsForValue().set(session.getId(), session, expire, TimeUnit.SECONDS);
@@ -86,12 +104,22 @@ public class SaTokenDaoRedis implements SaTokenDao {
// 删除一个指定的session
@Override
public void deleteSaSession(String sessionId) {
public void deleteSession(String sessionId) {
redisTemplate.delete(sessionId);
}
// 获取指定SaSession的剩余存活时间 (单位: 秒)
@Override
public long getSessionTimeout(String sessionId) {
return redisTemplate.getExpire(sessionId);
}

View File

@@ -57,7 +57,7 @@ public class StpUserUtil {
* 获取当前会话的token信息tokenName与tokenValue
* @return 一个Map对象
*/
public static Map<String, String> getTokenInfo() {
public static Map<String, Object> getTokenInfo() {
return stpLogic.getTokenInfo();
}

View File

@@ -18,6 +18,16 @@ import cn.dev33.satoken.stp.StpUtil;
@RequestMapping("/test/")
public class TestController {
// 当前是否登录 浏览器访问: http://localhost:8081/test/isLogin
@RequestMapping("isLogin")
public AjaxJson isLogin() {
System.out.println("当前是否登录:" + StpUtil.isLogin());
System.out.println("当前登录账号id" + StpUtil.getLoginId(-1));
return AjaxJson.getSuccessData(StpUtil.getTokenInfo());
}
// 测试登录接口, 浏览器访问: http://localhost:8081/test/login
@RequestMapping("login")
public AjaxJson login(@RequestParam(defaultValue="10001") String id) {