From 50ffda7bef2174324fec9496c91aace737b02ea4 Mon Sep 17 00:00:00 2001 From: shengzhang <2393584716@qq.com> Date: Sat, 20 Mar 2021 16:51:18 +0800 Subject: [PATCH] =?UTF-8?q?`SaTokenManager`=E6=96=B0=E5=A2=9E`stpLogicMap`?= =?UTF-8?q?=E9=9B=86=E5=90=88=EF=BC=8C=E8=AE=B0=E5=BD=95=E6=89=80=E6=9C=89?= =?UTF-8?q?`StpLogic`=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E4=BE=BF=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/dev33/satoken/SaTokenManager.java | 139 ++++++++++-------- .../cn/dev33/satoken/session/SaSession.java | 68 +++++---- .../java/cn/dev33/satoken/stp/StpLogic.java | 2 + sa-token-doc/doc/fun/tech-stack.md | 2 +- 4 files changed, 125 insertions(+), 86 deletions(-) diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java b/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java index c1002ebe..dbe90b4f 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/SaTokenManager.java @@ -1,5 +1,8 @@ package cn.dev33.satoken; +import java.util.HashMap; +import java.util.Map; + import cn.dev33.satoken.action.SaTokenAction; import cn.dev33.satoken.action.SaTokenActionDefaultImpl; import cn.dev33.satoken.config.SaTokenConfig; @@ -12,6 +15,7 @@ import cn.dev33.satoken.servlet.SaTokenServlet; import cn.dev33.satoken.servlet.SaTokenServletDefaultImpl; import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpInterfaceDefaultImpl; +import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.util.SaTokenInsideUtil; /** @@ -21,129 +25,148 @@ import cn.dev33.satoken.util.SaTokenInsideUtil; */ public class SaTokenManager { - /** * 配置文件 Bean */ private static SaTokenConfig config; - public static SaTokenConfig getConfig() { - if (config == null) { - initConfig(); - } - return config; - } public static void setConfig(SaTokenConfig config) { SaTokenManager.config = config; if(config.getIsV()) { SaTokenInsideUtil.printSaToken(); } } - public synchronized static void initConfig() { + public static SaTokenConfig getConfig() { if (config == null) { - setConfig(SaTokenConfigFactory.createConfig()); + // 如果对象为空,则使用框架默认方式初始化 + synchronized (SaTokenManager.class) { + if (config == null) { + setConfig(SaTokenConfigFactory.createConfig()); + } + } } + return config; } /** * 持久化 Bean */ - public static SaTokenDao saTokenDao; - public static SaTokenDao getSaTokenDao() { - if (saTokenDao == null) { - initSaTokenDao(); - } - return saTokenDao; - } + private static SaTokenDao saTokenDao; public static void setSaTokenDao(SaTokenDao saTokenDao) { if(SaTokenManager.saTokenDao != null && (SaTokenManager.saTokenDao instanceof SaTokenDaoDefaultImpl)) { ((SaTokenDaoDefaultImpl)SaTokenManager.saTokenDao).endRefreshTimer(); } SaTokenManager.saTokenDao = saTokenDao; } - public synchronized static void initSaTokenDao() { + public static SaTokenDao getSaTokenDao() { if (saTokenDao == null) { - setSaTokenDao(new SaTokenDaoDefaultImpl()); + // 如果对象为空,则使用框架默认方式初始化 + synchronized (SaTokenManager.class) { + if (saTokenDao == null) { + setSaTokenDao(new SaTokenDaoDefaultImpl()); + } + } } + return saTokenDao; } /** * 权限认证 Bean */ - public static StpInterface stpInterface; - public static StpInterface getStpInterface() { - if (stpInterface == null) { - initStpInterface(); - } - return stpInterface; - } + private static StpInterface stpInterface; public static void setStpInterface(StpInterface stpInterface) { SaTokenManager.stpInterface = stpInterface; } - public synchronized static void initStpInterface() { + public static StpInterface getStpInterface() { if (stpInterface == null) { - setStpInterface(new StpInterfaceDefaultImpl()); + // 如果对象为空,则使用框架默认方式初始化 + synchronized (SaTokenManager.class) { + if (stpInterface == null) { + setStpInterface(new StpInterfaceDefaultImpl()); + } + } } + return stpInterface; } /** * 框架行为 Bean */ - public static SaTokenAction saTokenAction; - public static SaTokenAction getSaTokenAction() { - if (saTokenAction == null) { - initSaTokenAction(); - } - return saTokenAction; - } + private static SaTokenAction saTokenAction; public static void setSaTokenAction(SaTokenAction saTokenAction) { SaTokenManager.saTokenAction = saTokenAction; } - public synchronized static void initSaTokenAction() { + public static SaTokenAction getSaTokenAction() { if (saTokenAction == null) { - setSaTokenAction(new SaTokenActionDefaultImpl()); + // 如果对象为空,则使用框架默认方式初始化 + synchronized (SaTokenManager.class) { + if (saTokenAction == null) { + setSaTokenAction(new SaTokenActionDefaultImpl()); + } + } } + return saTokenAction; } - + /** * Cookie操作 Bean */ - public static SaTokenCookie saTokenCookie; - public static SaTokenCookie getSaTokenCookie() { - if (saTokenCookie == null) { - initSaTokenCookie(); - } - return saTokenCookie; - } + private static SaTokenCookie saTokenCookie; public static void setSaTokenCookie(SaTokenCookie saTokenCookie) { SaTokenManager.saTokenCookie = saTokenCookie; } - public synchronized static void initSaTokenCookie() { + public static SaTokenCookie getSaTokenCookie() { if (saTokenCookie == null) { - setSaTokenCookie(new SaTokenCookieDefaultImpl()); + // 如果对象为空,则使用框架默认方式初始化 + synchronized (SaTokenManager.class) { + if (saTokenCookie == null) { + setSaTokenCookie(new SaTokenCookieDefaultImpl()); + } + } } + return saTokenCookie; } /** * Servlet操作 Bean */ - public static SaTokenServlet saTokenServlet; - public static SaTokenServlet getSaTokenServlet() { - if (saTokenServlet == null) { - initSaTokenServlet(); - } - return saTokenServlet; - } + private static SaTokenServlet saTokenServlet; public static void setSaTokenServlet(SaTokenServlet saTokenServlet) { SaTokenManager.saTokenServlet = saTokenServlet; } - public synchronized static void initSaTokenServlet() { + public static SaTokenServlet getSaTokenServlet() { if (saTokenServlet == null) { - setSaTokenServlet(new SaTokenServletDefaultImpl()); + // 如果对象为空,则使用框架默认方式初始化 + if (saTokenServlet == null) { + setSaTokenServlet(new SaTokenServletDefaultImpl()); + } } + return saTokenServlet; + } + + /** + * StpLogic集合, 记录框架所有成功初始化的StpLogic + */ + public static Map stpLogicMap = new HashMap(); + /** + * 向集合中 put 一个 StpLogic + * @param stpLogic + */ + public static void putStpLogic(StpLogic stpLogic) { + stpLogicMap.put(stpLogic.getLoginKey(), stpLogic); + } + /** + * 根据 LoginKey 获取对应的StpLogic,如果不存在则返回null + * @param loginKey 对应的LoginKey + * @return 对应的StpLogic + */ + public static StpLogic getStpLogic(String loginKey) { + for (String key : stpLogicMap.keySet()) { + if(key.equals(loginKey)) { + return stpLogicMap.get(key); + } + } + return null; } - - - } 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 6928eb1b..2d5d2159 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 @@ -237,8 +237,39 @@ public class SaSession implements Serializable { } + // ----------------------- 一些操作 + + /** + * 将这个Session从持久库更新一下 + */ + public void update() { + SaTokenManager.getSaTokenDao().updateSession(this); + } + + /** 注销会话 (注销后,此session会话将不再存储服务器上) */ + public void logout() { + SaTokenManager.getSaTokenDao().deleteSession(this.id); + } + + /** 当Session上的tokenSign数量为零时,注销会话 */ + public void logoutByTokenSignCountToZero() { + if (tokenSignList.size() == 0) { + logout(); + } + } + + // ----------------------- 存取值 (类型转换) + /** + * 判断一个值是否为null + * @param value 指定值 + * @return 此value是否为null + */ + public boolean valueIsNull(Object value) { + return value == null || value.equals(""); + } + /** * 从Session中取值,并转化为Object类型 * @param key key @@ -273,36 +304,19 @@ public class SaSession implements Serializable { } return Integer.valueOf(String.valueOf(value)); } - - /** - * 判断一个值是否为null - * @param value 指定值 - * @return 此value是否为null - */ - public boolean valueIsNull(Object value) { - return value == null || value.equals(""); - } - - - // ----------------------- 一些操作 /** - * 将这个Session从持久库更新一下 + * 从Session中取值,并转化为long类型,如果value为空,则返回0 + * @param key key + * @return 值 */ - public void update() { - SaTokenManager.getSaTokenDao().updateSession(this); - } - - /** 注销会话 (注销后,此session会话将不再存储服务器上) */ - public void logout() { - SaTokenManager.getSaTokenDao().deleteSession(this.id); - } - - /** 当Session上的tokenSign数量为零时,注销会话 */ - public void logoutByTokenSignCountToZero() { - if (tokenSignList.size() == 0) { - logout(); + public long getLong(String key) { + Object value = getObject(key); + if(valueIsNull(value)) { + return 0; } + return Long.valueOf(String.valueOf(value)); } - + + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java index 60abb642..2be77419 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java @@ -45,6 +45,8 @@ public class StpLogic { */ public StpLogic(String loginKey) { this.loginKey = loginKey; + // 在 SaTokenManager 中记录下此 StpLogic,以便根据 LoginKey 进行查找此对象 + SaTokenManager.putStpLogic(this); } /** diff --git a/sa-token-doc/doc/fun/tech-stack.md b/sa-token-doc/doc/fun/tech-stack.md index 5d43e592..52d8ff8c 100644 --- a/sa-token-doc/doc/fun/tech-stack.md +++ b/sa-token-doc/doc/fun/tech-stack.md @@ -7,7 +7,7 @@ - SpringBoot2.0、Redis、Jackson、Hutool、jwt - SpringBoot自定义starter、Spring包扫码 + 依赖注入、AOP注解切面、yml配置映射、拦截器 - Java8 接口与default实现、静态方法、枚举、定时器、异常类、泛型、反射、IO流、自定义注解、Lambda表达式、函数式编程 -- package-info注释、Serializable序列化接口、 +- package-info注释、Serializable序列化接口、synchronized锁 - java加密算法:MD5、SHA1、SHA256、AES、RSA - OAuth2.0、同域单点登录、集群与分布式、路由Ant匹配