mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-09-20 02:29:27 +08:00
新增 SaApplication 对象,用于全局作用域存取值
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
package cn.dev33.satoken.application;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.dao.SaTokenDao;
|
||||
|
||||
/**
|
||||
* Application Model,全局作用域的读取值对象
|
||||
*
|
||||
* @author kong
|
||||
* @since: 2022-8-17
|
||||
*/
|
||||
public class SaApplication implements SaSetValueInterface {
|
||||
|
||||
/**
|
||||
* 默认实例
|
||||
*/
|
||||
public static SaApplication defaultInstance = new SaApplication();
|
||||
|
||||
// ---- 实现接口存取值方法
|
||||
|
||||
/** 取值 */
|
||||
@Override
|
||||
public Object get(String key) {
|
||||
return SaManager.getSaTokenDao().getObject(splicingDataKey(key));
|
||||
}
|
||||
|
||||
/** 写值 */
|
||||
@Override
|
||||
public SaApplication set(String key, Object value) {
|
||||
SaManager.getSaTokenDao().setObject(splicingDataKey(key), value, SaTokenDao.NEVER_EXPIRE);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删值
|
||||
* @param key 要删除的key
|
||||
* @return 对象自身
|
||||
*/
|
||||
public SaApplication delete(String key) {
|
||||
SaManager.getSaTokenDao().deleteObject(splicingDataKey(key));
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// ---- 其它方法
|
||||
|
||||
/**
|
||||
* 返回存入的所有 key
|
||||
* @return /
|
||||
*/
|
||||
public List<String> keys() {
|
||||
// 查出来
|
||||
String prefix = splicingDataKey("");
|
||||
List<String> list = SaManager.getSaTokenDao().searchData(prefix, "", -1, 0, true);
|
||||
|
||||
// 裁减掉固定前缀
|
||||
int prefixLength = prefix.length();
|
||||
List<String> list2 = new ArrayList<>();
|
||||
if(list != null) {
|
||||
for (String key : list) {
|
||||
list2.add(key.substring(prefixLength));
|
||||
}
|
||||
}
|
||||
|
||||
// 返回
|
||||
return list2;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空存入的所有 key
|
||||
*/
|
||||
public void clear() {
|
||||
List<String> keys = keys();
|
||||
for (String key : keys) {
|
||||
delete(key);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 拼接key:变量存储时使用的key
|
||||
* @param key 原始 key
|
||||
* @return 拼接后的 key 值
|
||||
*/
|
||||
public String splicingDataKey(String key) {
|
||||
return SaManager.getConfig().getTokenName() + ":var:" + key;
|
||||
}
|
||||
|
||||
}
|
@@ -1,10 +1,9 @@
|
||||
package cn.dev33.satoken.session;
|
||||
package cn.dev33.satoken.application;
|
||||
|
||||
import cn.dev33.satoken.fun.SaRetFunction;
|
||||
import cn.dev33.satoken.util.SaFoxUtil;
|
||||
|
||||
/**
|
||||
* 对取值写值的一组方法封装
|
||||
* 对取值的一组方法封装
|
||||
*
|
||||
* @author kong
|
||||
* @since: 2022-8-16
|
||||
@@ -20,19 +19,9 @@ public interface SaGetValueInterface {
|
||||
*/
|
||||
public abstract Object get(String key);
|
||||
|
||||
/**
|
||||
* 写值
|
||||
* @param key 名称
|
||||
* @param value 值
|
||||
* @return 对象自身
|
||||
*/
|
||||
public abstract SaGetValueInterface set(String key, Object value);
|
||||
|
||||
|
||||
// --------- 接口提供封装的方法
|
||||
|
||||
// 取值
|
||||
|
||||
/**
|
||||
*
|
||||
* 取值 (指定默认值)
|
||||
@@ -45,24 +34,6 @@ public interface SaGetValueInterface {
|
||||
return getValueByDefaultValue(get(key), defaultValue);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* 取值 (如果值为 null,则执行 fun 函数获取值,并把函数返回值写入缓存)
|
||||
* @param <T> 返回值的类型
|
||||
* @param key key
|
||||
* @param fun 值为null时执行的函数
|
||||
* @return 值
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public default <T> T get(String key, SaRetFunction fun) {
|
||||
Object value = get(key);
|
||||
if(value == null) {
|
||||
value = fun.run();
|
||||
set(key, value);
|
||||
}
|
||||
return (T) value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取值 (转String类型)
|
||||
* @param key key
|
||||
@@ -140,21 +111,6 @@ public interface SaGetValueInterface {
|
||||
return SaFoxUtil.getValueByType(value, cs);
|
||||
}
|
||||
|
||||
// 写值 & 其它
|
||||
|
||||
/**
|
||||
* 写值 (只有在此 key 原本无值的情况下才会写入)
|
||||
* @param key 名称
|
||||
* @param value 值
|
||||
* @return 对象自身
|
||||
*/
|
||||
public default SaGetValueInterface setByNull(String key, Object value) {
|
||||
if(has(key) == false) {
|
||||
set(key, value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否含有某个key
|
||||
* @param key has
|
||||
@@ -165,8 +121,6 @@ public interface SaGetValueInterface {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// --------- 内部工具方法
|
||||
|
||||
/**
|
@@ -0,0 +1,64 @@
|
||||
package cn.dev33.satoken.application;
|
||||
|
||||
import cn.dev33.satoken.fun.SaRetFunction;
|
||||
|
||||
/**
|
||||
* 对写值的一组方法封装
|
||||
*
|
||||
* @author kong
|
||||
* @since: 2022-8-17
|
||||
*/
|
||||
public interface SaSetValueInterface extends SaGetValueInterface {
|
||||
|
||||
// --------- 需要子类实现的方法
|
||||
|
||||
/**
|
||||
* 写值
|
||||
* @param key 名称
|
||||
* @param value 值
|
||||
* @return 对象自身
|
||||
*/
|
||||
public abstract SaSetValueInterface set(String key, Object value);
|
||||
|
||||
/**
|
||||
* 删值
|
||||
* @param key 要删除的key
|
||||
* @return 对象自身
|
||||
*/
|
||||
public abstract SaSetValueInterface delete(String key);
|
||||
|
||||
|
||||
// --------- 接口提供封装的方法
|
||||
|
||||
/**
|
||||
*
|
||||
* 取值 (如果值为 null,则执行 fun 函数获取值,并把函数返回值写入缓存)
|
||||
* @param <T> 返回值的类型
|
||||
* @param key key
|
||||
* @param fun 值为null时执行的函数
|
||||
* @return 值
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public default <T> T get(String key, SaRetFunction fun) {
|
||||
Object value = get(key);
|
||||
if(value == null) {
|
||||
value = fun.run();
|
||||
set(key, value);
|
||||
}
|
||||
return (T) value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写值 (只有在此 key 原本无值的情况下才会写入)
|
||||
* @param key 名称
|
||||
* @param value 值
|
||||
* @return 对象自身
|
||||
*/
|
||||
public default SaSetValueInterface setByNull(String key, Object value) {
|
||||
if(has(key) == false) {
|
||||
set(key, value);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
package cn.dev33.satoken.context;
|
||||
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.application.SaApplication;
|
||||
import cn.dev33.satoken.context.model.SaRequest;
|
||||
import cn.dev33.satoken.context.model.SaResponse;
|
||||
import cn.dev33.satoken.context.model.SaStorage;
|
||||
@@ -48,4 +49,13 @@ public class SaHolder {
|
||||
return SaManager.getSaTokenContextOrSecond().getStorage();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取全局 SaApplication 对象
|
||||
*
|
||||
* @return see note
|
||||
*/
|
||||
public static SaApplication getApplication() {
|
||||
return SaApplication.defaultInstance;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -9,6 +9,7 @@ import java.util.Vector;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import cn.dev33.satoken.SaManager;
|
||||
import cn.dev33.satoken.application.SaSetValueInterface;
|
||||
import cn.dev33.satoken.dao.SaTokenDao;
|
||||
import cn.dev33.satoken.util.SaFoxUtil;
|
||||
|
||||
@@ -18,7 +19,7 @@ import cn.dev33.satoken.util.SaFoxUtil;
|
||||
* @author kong
|
||||
*
|
||||
*/
|
||||
public class SaSession implements SaGetValueInterface, Serializable {
|
||||
public class SaSession implements SaSetValueInterface, Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -286,7 +287,7 @@ public class SaSession implements SaGetValueInterface, Serializable {
|
||||
|
||||
// ----------------------- 存取值 (类型转换)
|
||||
|
||||
// ---- 实现接口存取值方法
|
||||
// ---- 重写接口方法
|
||||
|
||||
/**
|
||||
* 取值
|
||||
@@ -326,26 +327,19 @@ public class SaSession implements SaGetValueInterface, Serializable {
|
||||
return this;
|
||||
}
|
||||
|
||||
// ---- 其它方法
|
||||
|
||||
/**
|
||||
* 删值
|
||||
* @param key 要删除的key
|
||||
* @return 对象自身
|
||||
*/
|
||||
@Override
|
||||
public SaSession delete(String key) {
|
||||
dataMap.remove(key);
|
||||
update();
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空所有值
|
||||
*/
|
||||
public void clear() {
|
||||
dataMap.clear();
|
||||
update();
|
||||
}
|
||||
// ---- 其它方法
|
||||
|
||||
/**
|
||||
* 返回当前Session的所有key
|
||||
@@ -356,6 +350,14 @@ public class SaSession implements SaGetValueInterface, Serializable {
|
||||
return dataMap.keySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空所有值
|
||||
*/
|
||||
public void clear() {
|
||||
dataMap.clear();
|
||||
update();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据挂载集合(如果更新map里的值,请调用session.update()方法避免产生脏数据 )
|
||||
*
|
||||
|
Reference in New Issue
Block a user