新增 SaApplication 对象,用于全局作用域存取值

This commit is contained in:
click33
2022-08-17 09:23:37 +08:00
parent 9713b4fe26
commit 823d43b183
5 changed files with 180 additions and 59 deletions

View File

@@ -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;
}
}

View File

@@ -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 {
}
// --------- 内部工具方法
/**

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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()方法避免产生脏数据
*