From 823d43b183345e007e5627074bf992fe7253c9e6 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Wed, 17 Aug 2022 09:23:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20SaApplication=20=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=EF=BC=8C=E7=94=A8=E4=BA=8E=E5=85=A8=E5=B1=80=E4=BD=9C?= =?UTF-8?q?=E7=94=A8=E5=9F=9F=E5=AD=98=E5=8F=96=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../satoken/application/SaApplication.java | 91 +++++++++++++++++++ .../SaGetValueInterface.java | 50 +--------- .../application/SaSetValueInterface.java | 64 +++++++++++++ .../cn/dev33/satoken/context/SaHolder.java | 10 ++ .../cn/dev33/satoken/session/SaSession.java | 24 ++--- 5 files changed, 180 insertions(+), 59 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java rename sa-token-core/src/main/java/cn/dev33/satoken/{session => application}/SaGetValueInterface.java (75%) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java new file mode 100644 index 00000000..3f10cf37 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java @@ -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 keys() { + // 查出来 + String prefix = splicingDataKey(""); + List list = SaManager.getSaTokenDao().searchData(prefix, "", -1, 0, true); + + // 裁减掉固定前缀 + int prefixLength = prefix.length(); + List list2 = new ArrayList<>(); + if(list != null) { + for (String key : list) { + list2.add(key.substring(prefixLength)); + } + } + + // 返回 + return list2; + } + + /** + * 清空存入的所有 key + */ + public void clear() { + List 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; + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaGetValueInterface.java b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaGetValueInterface.java similarity index 75% rename from sa-token-core/src/main/java/cn/dev33/satoken/session/SaGetValueInterface.java rename to sa-token-core/src/main/java/cn/dev33/satoken/application/SaGetValueInterface.java index cbdb8c09..97bda787 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaGetValueInterface.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaGetValueInterface.java @@ -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 返回值的类型 - * @param key key - * @param fun 值为null时执行的函数 - * @return 值 - */ - @SuppressWarnings("unchecked") - public default 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 { } - - // --------- 内部工具方法 /** diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java new file mode 100644 index 00000000..a7edc991 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java @@ -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 返回值的类型 + * @param key key + * @param fun 值为null时执行的函数 + * @return 值 + */ + @SuppressWarnings("unchecked") + public default 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; + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java index b6834e34..e1accd9d 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java @@ -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; + } + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java index e49b97bc..12376c35 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java @@ -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()方法避免产生脏数据 ) *