mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-04-24 18:04:47 +08:00
修复jFinal缓存处理类BUG
This commit is contained in:
parent
9c852da49b
commit
6363db248a
@ -4,54 +4,73 @@ import cn.dev33.satoken.dao.SaTokenDao;
|
||||
import cn.dev33.satoken.util.SaFoxUtil;
|
||||
import com.jfinal.plugin.redis.Cache;
|
||||
import com.jfinal.plugin.redis.Redis;
|
||||
import com.jfinal.plugin.redis.serializer.ISerializer;
|
||||
import redis.clients.jedis.Jedis;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 缓存处理类
|
||||
*/
|
||||
public class SaTokenDaoRedis implements SaTokenDao {
|
||||
|
||||
private Cache redis = null;
|
||||
protected Cache redis;
|
||||
protected ISerializer serializer;
|
||||
/**
|
||||
* 标记:是否已初始化成功
|
||||
*/
|
||||
public boolean isInit;
|
||||
|
||||
public SaTokenDaoRedis(String confName){
|
||||
public SaTokenDaoRedis(String confName) {
|
||||
redis = Redis.use(confName);
|
||||
this.isInit = redis != null;
|
||||
serializer = new SaJdkSerializer();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取Value,如无返空
|
||||
*
|
||||
* @param key
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String get(String key) {
|
||||
return redis.getJedis().get(key);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
return jedis.get(key);
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入Value,并设定存活时间 (单位: 秒)
|
||||
*
|
||||
* @param key
|
||||
* @param value
|
||||
* @param timeout
|
||||
*/
|
||||
@Override
|
||||
public void set(String key, String value, long timeout) {
|
||||
if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
return;
|
||||
}
|
||||
if(timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
redis.getJedis().set(key, value);
|
||||
}else{
|
||||
redis.getJedis().setex(key,timeout,value);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
if (timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
jedis.set(key, value);
|
||||
} else {
|
||||
jedis.setex(key, timeout, value);
|
||||
}
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改指定key-value键值对 (过期时间不变)
|
||||
*
|
||||
* @param key
|
||||
* @param value
|
||||
*/
|
||||
@ -59,42 +78,55 @@ public class SaTokenDaoRedis implements SaTokenDao {
|
||||
public void update(String key, String value) {
|
||||
long expire = getTimeout(key);
|
||||
// -2 = 无此键
|
||||
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
if (expire == SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
return;
|
||||
}
|
||||
this.set(key,value,expire);
|
||||
this.set(key, value, expire);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除Value
|
||||
*
|
||||
* @param key
|
||||
*/
|
||||
@Override
|
||||
public void delete(String key) {
|
||||
redis.getJedis().del(key);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
jedis.del(key);
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取Value的剩余存活时间 (单位: 秒)
|
||||
*
|
||||
* @param key
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public long getTimeout(String key) {
|
||||
return redis.getJedis().ttl(key);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
return jedis.ttl(key);
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改Value的剩余存活时间 (单位: 秒)
|
||||
*
|
||||
* @param key
|
||||
* @param timeout
|
||||
*/
|
||||
@Override
|
||||
public void updateTimeout(String key, long timeout) {
|
||||
//判断是否想要设置为永久
|
||||
if(timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
if (timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
long expire = getTimeout(key);
|
||||
if(expire == SaTokenDao.NEVER_EXPIRE) {
|
||||
if (expire == SaTokenDao.NEVER_EXPIRE) {
|
||||
// 如果其已经被设置为永久,则不作任何处理
|
||||
} else {
|
||||
// 如果尚未被设置为永久,那么再次set一次
|
||||
@ -102,39 +134,57 @@ public class SaTokenDaoRedis implements SaTokenDao {
|
||||
}
|
||||
return;
|
||||
}
|
||||
redis.getJedis().expire(key,timeout);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
jedis.expire(key, timeout);
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取Object,如无返空
|
||||
*
|
||||
* @param key
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Object getObject(String key) {
|
||||
return redis.get(key);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
return valueFromBytes(jedis.get(keyToBytes(key)));
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入Object,并设定存活时间 (单位: 秒)
|
||||
*
|
||||
* @param key
|
||||
* @param object
|
||||
* @param timeout
|
||||
*/
|
||||
@Override
|
||||
public void setObject(String key, Object object, long timeout) {
|
||||
if(timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
return;
|
||||
}
|
||||
if(timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
redis.set(key, object);
|
||||
}else{
|
||||
redis.setex(key,Integer.parseInt(timeout+""),object);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
if (timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
jedis.set(keyToBytes(key), valueToBytes(object));
|
||||
} else {
|
||||
jedis.setex(keyToBytes(key), timeout, valueToBytes(object));
|
||||
}
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新Object (过期时间不变)
|
||||
*
|
||||
* @param key
|
||||
* @param object
|
||||
*/
|
||||
@ -142,7 +192,7 @@ public class SaTokenDaoRedis implements SaTokenDao {
|
||||
public void updateObject(String key, Object object) {
|
||||
long expire = getObjectTimeout(key);
|
||||
// -2 = 无此键
|
||||
if(expire == SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
if (expire == SaTokenDao.NOT_VALUE_EXPIRE) {
|
||||
return;
|
||||
}
|
||||
this.setObject(key, object, expire);
|
||||
@ -150,41 +200,59 @@ public class SaTokenDaoRedis implements SaTokenDao {
|
||||
|
||||
/**
|
||||
* 删除Object
|
||||
*
|
||||
* @param key
|
||||
*/
|
||||
@Override
|
||||
public void deleteObject(String key) {
|
||||
redis.del(key);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
jedis.del(keyToBytes(key));
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getObjectTimeout(String key) {
|
||||
return redis.ttl(key);
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
return jedis.ttl(keyToBytes(key));
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改Object的剩余存活时间 (单位: 秒)
|
||||
*
|
||||
* @param key
|
||||
* @param timeout
|
||||
*/
|
||||
@Override
|
||||
public void updateObjectTimeout(String key, long timeout) {
|
||||
//判断是否想要设置为永久
|
||||
if(timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
long expire = getTimeout(key);
|
||||
if(expire == SaTokenDao.NEVER_EXPIRE) {
|
||||
if (timeout == SaTokenDao.NEVER_EXPIRE) {
|
||||
long expire = getObjectTimeout(key);
|
||||
if (expire == SaTokenDao.NEVER_EXPIRE) {
|
||||
// 如果其已经被设置为永久,则不作任何处理
|
||||
} else {
|
||||
// 如果尚未被设置为永久,那么再次set一次
|
||||
this.set(key, this.get(key), timeout);
|
||||
this.setObject(key, this.getObject(key), timeout);
|
||||
}
|
||||
return;
|
||||
}
|
||||
redis.expire(key,Integer.parseInt(timeout+""));
|
||||
Jedis jedis = getJedis();
|
||||
try {
|
||||
jedis.expire(keyToBytes(key), timeout);
|
||||
} finally {
|
||||
close(jedis);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索数据
|
||||
*
|
||||
* @param prefix
|
||||
* @param keyword
|
||||
* @param start
|
||||
@ -197,4 +265,25 @@ public class SaTokenDaoRedis implements SaTokenDao {
|
||||
List<String> list = new ArrayList<String>(keys);
|
||||
return SaFoxUtil.searchList(list, start, size);
|
||||
}
|
||||
|
||||
public Jedis getJedis() {
|
||||
return redis.getJedis();
|
||||
}
|
||||
|
||||
public void close(Jedis jedis) {
|
||||
if (jedis != null)
|
||||
jedis.close();
|
||||
}
|
||||
|
||||
protected byte[] keyToBytes(Object key) {
|
||||
return key.toString().getBytes();
|
||||
}
|
||||
|
||||
protected byte[] valueToBytes(Object value) {
|
||||
return serializer.valueToBytes(value);
|
||||
}
|
||||
|
||||
protected Object valueFromBytes(byte[] bytes) {
|
||||
return serializer.valueFromBytes(bytes);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user