diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java b/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java index 3753485a..ce6f24fd 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java @@ -14,9 +14,9 @@ import cn.dev33.satoken.error.SaErrorCode; import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.json.SaJsonTemplateDefaultImpl; +import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.log.SaLog; import cn.dev33.satoken.log.SaLogForConsole; -import cn.dev33.satoken.log.input.SaLogInput; import cn.dev33.satoken.same.SaSameTemplate; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.sign.SaSignTemplateDefaultImpl; @@ -43,12 +43,12 @@ public class SaManager { setConfigMethod(config); // 打印 banner - if(config.getIsPrint()) { + if(config !=null && config.getIsPrint()) { SaFoxUtil.printSaToken(); } - // ## 发送日志 - SaManager.getLogInput().registerConfig(config); + // $$ 全局事件 + SaTokenEventCenter.doSetConfig(config); // 调用一次StpUtil中的方法,保证其可以尽早的初始化 StpLogic StpUtil.getLoginType(); @@ -73,7 +73,7 @@ public class SaManager { private volatile static SaTokenDao saTokenDao; public static void setSaTokenDao(SaTokenDao saTokenDao) { setSaTokenDaoMethod(saTokenDao); - SaManager.getLogInput().registerComponent("SaTokenDao", saTokenDao); + SaTokenEventCenter.doRegisterComponent("SaTokenDao", saTokenDao); } private static void setSaTokenDaoMethod(SaTokenDao saTokenDao) { if((SaManager.saTokenDao instanceof SaTokenDaoDefaultImpl)) { @@ -98,7 +98,7 @@ public class SaManager { private volatile static StpInterface stpInterface; public static void setStpInterface(StpInterface stpInterface) { SaManager.stpInterface = stpInterface; - SaManager.getLogInput().registerComponent("StpInterface", stpInterface); + SaTokenEventCenter.doRegisterComponent("StpInterface", stpInterface); } public static StpInterface getStpInterface() { if (stpInterface == null) { @@ -117,7 +117,7 @@ public class SaManager { private volatile static SaTokenContext saTokenContext; public static void setSaTokenContext(SaTokenContext saTokenContext) { SaManager.saTokenContext = saTokenContext; - SaManager.getLogInput().registerComponent("SaTokenContext", saTokenContext); + SaTokenEventCenter.doRegisterComponent("SaTokenContext", saTokenContext); } public static SaTokenContext getSaTokenContext() { return saTokenContext; @@ -129,7 +129,7 @@ public class SaManager { private volatile static SaTokenSecondContext saTokenSecondContext; public static void setSaTokenSecondContext(SaTokenSecondContext saTokenSecondContext) { SaManager.saTokenSecondContext = saTokenSecondContext; - SaManager.getLogInput().registerComponent("SaTokenSecondContext", saTokenSecondContext); + SaTokenEventCenter.doRegisterComponent("SaTokenSecondContext", saTokenSecondContext); } public static SaTokenSecondContext getSaTokenSecondContext() { return saTokenSecondContext; @@ -165,7 +165,7 @@ public class SaManager { private volatile static SaTempInterface saTemp; public static void setSaTemp(SaTempInterface saTemp) { SaManager.saTemp = saTemp; - SaManager.getLogInput().registerComponent("SaTempInterface", saTemp); + SaTokenEventCenter.doRegisterComponent("SaTempInterface", saTemp); } public static SaTempInterface getSaTemp() { if (saTemp == null) { @@ -184,7 +184,7 @@ public class SaManager { private volatile static SaJsonTemplate saJsonTemplate; public static void setSaJsonTemplate(SaJsonTemplate saJsonTemplate) { SaManager.saJsonTemplate = saJsonTemplate; - SaManager.getLogInput().registerComponent("SaJsonTemplate", saJsonTemplate); + SaTokenEventCenter.doRegisterComponent("SaJsonTemplate", saJsonTemplate); } public static SaJsonTemplate getSaJsonTemplate() { if (saJsonTemplate == null) { @@ -203,7 +203,7 @@ public class SaManager { private volatile static SaSignTemplate saSignTemplate; public static void setSaSignTemplate(SaSignTemplate saSignTemplate) { SaManager.saSignTemplate = saSignTemplate; - SaManager.getLogInput().registerComponent("SaSignTemplate", saSignTemplate); + SaTokenEventCenter.doRegisterComponent("SaSignTemplate", saSignTemplate); } public static SaSignTemplate getSaSignTemplate() { if (saSignTemplate == null) { @@ -222,7 +222,7 @@ public class SaManager { private volatile static SaSameTemplate saSameTemplate; public static void setSaSameTemplate(SaSameTemplate saSameTemplate) { SaManager.saSameTemplate = saSameTemplate; - SaManager.getLogInput().registerComponent("SaSameTemplate", saSameTemplate); + SaTokenEventCenter.doRegisterComponent("SaSameTemplate", saSameTemplate); } public static SaSameTemplate getSaSameTemplate() { if (saSameTemplate == null) { @@ -234,33 +234,14 @@ public class SaManager { } return saSameTemplate; } - - /** - * 日志接收器 - */ - private volatile static SaLogInput logInput; - public static void setLogInput(SaLogInput logInput) { - SaManager.logInput = logInput; - SaManager.getLogInput().registerComponent("SaLogInput", logInput); - } - public static SaLogInput getLogInput() { - if (logInput == null) { - synchronized (SaManager.class) { - if (logInput == null) { - SaManager.logInput = new SaLogInput(); - } - } - } - return logInput; - } - + /** * 日志输出器 */ public volatile static SaLog log = new SaLogForConsole(); public static void setLog(SaLog log) { SaManager.log = log; - SaManager.getLogInput().registerComponent("SaLog", log); + SaTokenEventCenter.doRegisterComponent("SaLog", log); } public static SaLog getLog() { return SaManager.log; diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventCenter.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventCenter.java index 9bfc7bae..2b9da432 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventCenter.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventCenter.java @@ -3,9 +3,11 @@ package cn.dev33.satoken.listener; import java.util.ArrayList; import java.util.List; +import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.error.SaErrorCode; import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpLogic; /** * Sa-Token 事件中心 事件发布器 @@ -257,4 +259,36 @@ public class SaTokenEventCenter { } } + + /** + * 全局组件载入 + * @param comtName 组件名称 + * @param comtObj 组件对象 + */ + public static void doRegisterComponent(String comtName, Object comtObj) { + for (SaTokenListener listener : listenerList) { + listener.doRegisterComponent(comtName, comtObj); + } + } + + /** + * StpLogic 对象替换 + * @param stpLogic / + */ + public static void doSetStpLogic(StpLogic stpLogic) { + for (SaTokenListener listener : listenerList) { + listener.doSetStpLogic(stpLogic); + } + } + + /** + * 载入全局配置 + * @param stpLogic / + */ + public static void doSetConfig(SaTokenConfig config) { + for (SaTokenListener listener : listenerList) { + listener.doSetConfig(config); + } + } + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java index 839d3d57..b4829ac1 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java @@ -1,6 +1,8 @@ package cn.dev33.satoken.listener; +import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpLogic; /** * Sa-Token 侦听器 @@ -98,5 +100,24 @@ public interface SaTokenListener { * @param timeout 续期时间 */ public void doRenewTimeout(String tokenValue, Object loginId, long timeout); - + + /** + * 全局组件载入 + * @param comtName 组件名称 + * @param comtObj 组件对象 + */ + public default void doRegisterComponent(String comtName, Object comtObj) {} + + /** + * StpLogic 对象替换 + * @param stpLogic / + */ + public default void doSetStpLogic(StpLogic stpLogic) {} + + /** + * 载入全局配置 + * @param stpLogic / + */ + public default void doSetConfig(SaTokenConfig config) {} + } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForLog.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForLog.java index 75afa853..c8da71ff 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForLog.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForLog.java @@ -1,7 +1,11 @@ package cn.dev33.satoken.listener; -import cn.dev33.satoken.SaManager; +import static cn.dev33.satoken.SaManager.log; + +import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpLogic; +import cn.dev33.satoken.util.SaFoxUtil; /** * Sa-Token 侦听器实现:Log 打印 @@ -16,7 +20,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { - SaManager.getLogInput().doLogin(loginType, loginId, tokenValue, loginModel); + log.info("账号 {} 登录成功 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); } /** @@ -24,7 +28,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doLogout(String loginType, Object loginId, String tokenValue) { - SaManager.getLogInput().doLogout(loginType, loginId, tokenValue); + log.info("账号 {} 注销登录 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); } /** @@ -32,7 +36,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doKickout(String loginType, Object loginId, String tokenValue) { - SaManager.getLogInput().doKickout(loginType, loginId, tokenValue); + log.info("账号 {} 被踢下线 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); } /** @@ -40,7 +44,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doReplaced(String loginType, Object loginId, String tokenValue) { - SaManager.getLogInput().doReplaced(loginType, loginId, tokenValue); + log.info("账号 {} 被顶下线 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); } /** @@ -48,7 +52,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { - SaManager.getLogInput().doDisable(loginType, loginId, service, level, disableTime); + log.info("账号 {} [{}服务] 被封禁 (loginType={}), 封禁等级={}, 解封时间为 {}", loginId, loginType, service, level, SaFoxUtil.formatAfterDate(disableTime * 1000)); } /** @@ -56,7 +60,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doUntieDisable(String loginType, Object loginId, String service) { - SaManager.getLogInput().doUntieDisable(loginType, loginId, service); + log.info("账号 {} [{}服务] 解封成功 (loginType={})", loginId, service, loginType); } /** @@ -64,7 +68,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { - SaManager.getLogInput().doOpenSafe(loginType, tokenValue, service, safeTime); + log.info("Token 二级认证成功, 业务标识={}, 有效期={}秒, Token值={}", service, safeTime, tokenValue); } /** @@ -72,7 +76,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doCloseSafe(String loginType, String tokenValue, String service) { - SaManager.getLogInput().doCloseSafe(loginType, tokenValue, service); + log.info("Token 二级认证关闭, 业务标识={}, Token值={}", service, tokenValue); } /** @@ -80,7 +84,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doCreateSession(String id) { - SaManager.getLogInput().doCreateSession(id); + log.info("SaSession [{}] 创建成功", id); } /** @@ -88,7 +92,7 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doLogoutSession(String id) { - SaManager.getLogInput().doLogoutSession(id); + log.info("SaSession [{}] 注销成功", id); } /** @@ -96,8 +100,41 @@ public class SaTokenListenerForLog implements SaTokenListener { */ @Override public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { - SaManager.getLogInput().doRenewTimeout(tokenValue, loginId, timeout); + log.info("Token 续期成功, {} 秒后到期, 帐号={}, Token值={} ", timeout, loginId, tokenValue); + } + + + /** + * 全局组件载入 + * @param comtName 组件名称 + * @param comtObj 组件对象 + */ + @Override + public void doRegisterComponent(String comtName, Object comtObj) { + String canonicalName = comtObj == null ? null : comtObj.getClass().getCanonicalName(); + log.info("全局组件 {} 载入成功: {}", comtName, canonicalName); + } + + /** + * StpLogic 对象替换 + * @param stpLogic / + */ + @Override + public void doSetStpLogic(StpLogic stpLogic) { + if(stpLogic != null) { + log.info("会话组件 StpLogic(type={}) 重置成功: {}", stpLogic.getLoginType(), stpLogic.getClass()); + } + } + + /** + * 载入全局配置 + * @param stpLogic / + */ + @Override + public void doSetConfig(SaTokenConfig config) { + if(config != null) { + log.info("全局配置 {} ", config); + } } - } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/log/input/SaLogInput.java b/sa-token-core/src/main/java/cn/dev33/satoken/log/input/SaLogInput.java deleted file mode 100644 index 87acded0..00000000 --- a/sa-token-core/src/main/java/cn/dev33/satoken/log/input/SaLogInput.java +++ /dev/null @@ -1,160 +0,0 @@ -package cn.dev33.satoken.log.input; - -import static cn.dev33.satoken.SaManager.log; - -import cn.dev33.satoken.config.SaTokenConfig; -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpLogic; -import cn.dev33.satoken.util.SaFoxUtil; - -/** - * Sa-Token 日志接受器 - * - * @author kong - * @since 2022-11-1 - */ -public class SaLogInput { - - /** - * 账号登录 - * @param loginType 账号类别 - * @param loginId 账号id - * @param tokenValue 本次登录产生的 token 值 - * @param loginModel 登录参数 - */ - public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { - log.info("账号 {} 登录成功 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); - } - - /** - * 每次注销时触发 - * @param loginType 账号类别 - * @param loginId 账号id - * @param tokenValue token值 - */ - public void doLogout(String loginType, Object loginId, String tokenValue) { - log.info("账号 {} 注销登录 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); - } - - /** - * 每次被踢下线时触发 - * @param loginType 账号类别 - * @param loginId 账号id - * @param tokenValue token值 - */ - public void doKickout(String loginType, Object loginId, String tokenValue) { - log.info("账号 {} 被踢下线 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); - } - - /** - * 每次被顶下线时触发 - * @param loginType 账号类别 - * @param loginId 账号id - * @param tokenValue token值 - */ - public void doReplaced(String loginType, Object loginId, String tokenValue) { - log.info("账号 {} 被顶下线 (loginType={}), 会话凭证Token={}", loginId, loginType, tokenValue); - } - - /** - * 每次被封禁时触发 - * @param loginType 账号类别 - * @param loginId 账号id - * @param service 指定服务 - * @param level 封禁等级 - * @param disableTime 封禁时长,单位: 秒 - */ - public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { - log.info("账号 {} [{}服务] 被封禁 (loginType={}), 封禁等级={}, 解封时间为 {}", loginId, loginType, service, level, SaFoxUtil.formatAfterDate(disableTime * 1000)); - } - - /** - * 每次被解封时触发 - * @param loginType 账号类别 - * @param loginId 账号id - * @param service 指定服务 - */ - public void doUntieDisable(String loginType, Object loginId, String service) { - log.info("账号 {} [{}服务] 解封成功 (loginType={})", loginId, service, loginType); - } - - /** - * 每次打开二级认证时触发 - * @param loginType 账号类别 - * @param tokenValue token值 - * @param service 指定服务 - * @param safeTime 认证时间,单位:秒 - */ - public void doOpenSafe(String loginType, String tokenValue, String service, long safeTime) { - log.info("Token 二级认证成功, 业务标识={}, 有效期={}秒, Token值={}", service, safeTime, tokenValue); - } - - /** - * 每次关闭二级认证时触发 - * @param loginType 账号类别 - * @param tokenValue token值 - * @param service 指定服务 - */ - public void doCloseSafe(String loginType, String tokenValue, String service) { - log.info("Token 二级认证关闭, 业务标识={}, Token值={}", service, tokenValue); - } - - /** - * 每次创建Session时触发 - * @param id SessionId - */ - public void doCreateSession(String id) { - log.info("SaSession [{}] 创建成功", id); - } - - /** - * 每次注销Session时触发 - * @param id SessionId - */ - public void doLogoutSession(String id) { - log.info("SaSession [{}] 注销成功", id); - } - - /** - * 每次Token续期时触发 - * - * @param tokenValue token 值 - * @param loginId 账号id - * @param timeout 续期时间 - */ - public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { - log.info("Token 续期成功, {} 秒后到期, 帐号={}, Token值={} ", timeout, loginId, tokenValue); - } - - - /** - * 全局组件载入 - * @param comtName 组件名称 - * @param comtObj 组件对象 - */ - public void registerComponent(String comtName, Object comtObj) { - String canonicalName = comtObj == null ? null : comtObj.getClass().getCanonicalName(); - log.info("全局组件 {} 载入成功: {}", comtName, canonicalName); - } - - /** - * StpLogic 对象替换 - * @param stpLogic / - */ - public void replaceStpLogic(StpLogic stpLogic) { - if(stpLogic != null) { - log.info("会话组件 StpLogic(type={}) 重置成功: {}", stpLogic.getLoginType(), stpLogic.getClass()); - } - } - - /** - * 载入全局配置 - * @param stpLogic / - */ - public void registerConfig(SaTokenConfig config) { - if(config != null) { - log.info("全局配置 {} ", config); - } - } - -} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java index 2008ce0a..b4bededa 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java @@ -4,6 +4,7 @@ import java.util.List; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.session.SaSession; /** @@ -48,8 +49,8 @@ public class StpUtil { // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic SaManager.putStpLogic(newStpLogic); - // ## 发送日志 - SaManager.getLogInput().replaceStpLogic(stpLogic); + // $$ 全局事件 + SaTokenEventCenter.doSetStpLogic(stpLogic); } /** diff --git a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java index 3dcb0d32..f969c2e7 100644 --- a/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java +++ b/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaTokenInfo; @@ -54,8 +55,8 @@ public class StpUserUtil { // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic SaManager.putStpLogic(newStpLogic); - // ## 发送日志 - SaManager.getLogInput().replaceStpLogic(stpLogic); + // $$ 全局事件 + SaTokenEventCenter.doSetStpLogic(stpLogic); } /** diff --git a/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/SaTokenDemoApp.java b/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/SaTokenDemoApp.java index b238d9af..6607050d 100644 --- a/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/SaTokenDemoApp.java +++ b/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/SaTokenDemoApp.java @@ -1,17 +1,19 @@ package com.pj; -import cn.dev33.satoken.SaManager; import org.noear.solon.Solon; +import cn.dev33.satoken.SaManager; + /** * sa-token整合 solon 示例 * @author noear * */ public class SaTokenDemoApp { + public static void main(String[] args) { Solon.start(SaTokenDemoApp.class, args); - System.out.println("\n启动成功:sa-token配置如下:" + SaManager.getConfig()); + System.out.println("\n启动成功:Sa-Token配置如下:" + SaManager.getConfig()); } } \ No newline at end of file diff --git a/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/satoken/SaLogForSolon.java b/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/satoken/SaLogForSolon.java new file mode 100644 index 00000000..aa397a53 --- /dev/null +++ b/sa-token-demo/sa-token-demo-solon/src/main/java/com/pj/satoken/SaLogForSolon.java @@ -0,0 +1,34 @@ +package com.pj.satoken; + +import org.noear.solon.annotation.Component; +import org.noear.solon.core.util.PrintUtil; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.config.SaTokenConfig; +import cn.dev33.satoken.log.SaLog; +import cn.dev33.satoken.log.SaLogForConsole; +import cn.dev33.satoken.util.StrFormatter; + +/** + * 将 Sa-Token log 信息转接到 Slf4j + * + * @author kong + * @since 2022-11-2 + */ +@Component +public class SaLogForSolon extends SaLogForConsole implements SaLog { + + /** + * 打印日志到控制台 + * @param level 日志等级 + * @param str 字符串 + * @param args 参数列表 + */ + public void println(int level, String str, Object... args) { + SaTokenConfig config = SaManager.getConfig(); + if(config.getIsLog() && level >= config.getLogLevelInt()) { + PrintUtil.info(LOG_PREFIX + StrFormatter.format(str, args)); + } + } + +} diff --git a/sa-token-demo/sa-token-demo-solon/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-solon/src/main/resources/application.yml index 055d40e7..74dd60ef 100644 --- a/sa-token-demo/sa-token-demo-solon/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-solon/src/main/resources/application.yml @@ -17,7 +17,7 @@ sa-token: # token风格 token-style: uuid # 是否输出操作日志 - is-log: false + is-log: true solon: # redis配置 diff --git a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java index 3dcb0d32..f969c2e7 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java +++ b/sa-token-demo/sa-token-demo-test/src/main/java/com/pj/satoken/StpUserUtil.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Component; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaTokenInfo; @@ -54,8 +55,8 @@ public class StpUserUtil { // 以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic SaManager.putStpLogic(newStpLogic); - // ## 发送日志 - SaManager.getLogInput().replaceStpLogic(stpLogic); + // $$ 全局事件 + SaTokenEventCenter.doSetStpLogic(stpLogic); } /** diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java index 65cb110d..fd8c3dd9 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java @@ -19,7 +19,6 @@ import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.log.SaLog; -import cn.dev33.satoken.log.input.SaLogInput; import cn.dev33.satoken.same.SaSameTemplate; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.stp.StpInterface; @@ -37,15 +36,23 @@ import cn.dev33.satoken.temp.SaTempInterface; public class SaBeanInject { /** - * 注入配置Bean + * 组件注入 + *

为确保 Log 组件正常打印,必须将 SaLog 和 SaTokenConfig 率先初始化

* * @param saTokenConfig 配置对象 */ - @Autowired(required = false) - public void setConfig(SaTokenConfig saTokenConfig) { - SaManager.setConfig(saTokenConfig); + public SaBeanInject( + @Autowired(required = false) SaLog log, + @Autowired(required = false) SaTokenConfig saTokenConfig + ){ + if(log != null) { + SaManager.setLog(log); + } + if(saTokenConfig != null) { + SaManager.setConfig(saTokenConfig); + } } - + /** * 注入持久化Bean * @@ -156,26 +163,6 @@ public class SaBeanInject { SaManager.setSaSignTemplate(saSignTemplate); } - /** - * 注入自定义的 日志输出 Bean - * - * @param log / - */ - @Autowired(required = false) - public void setLog(SaLog log) { - SaManager.setLog(log); - } - - /** - * 注入自定义的 日志接受 Bean - * - * @param logInput / - */ - @Autowired(required = false) - public void setLogInput(SaLogInput logInput) { - SaManager.setLogInput(logInput); - } - /** * 注入自定义的 StpLogic * @param stpLogic / diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanRegister.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanRegister.java index 3937be72..d8f25fcb 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanRegister.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanRegister.java @@ -5,7 +5,6 @@ import org.springframework.context.annotation.Bean; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaTokenContext; -import cn.dev33.satoken.context.SaTokenContextForThreadLocal; import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.reactor.spring.json.SaJsonTemplateForJackson; @@ -35,15 +34,7 @@ public class SaBeanRegister { */ @Bean public SaTokenContext getSaTokenContext() { - return new SaTokenContextForThreadLocal() { - /** - * 重写路由匹配方法 - */ - @Override - public boolean matchPath(String pattern, String path) { - return SaPathMatcherHolder.getPathMatcher().match(pattern, path); - } - }; + return new SaTokenContextForSpringReactor(); } /** diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java new file mode 100644 index 00000000..29feeb96 --- /dev/null +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaTokenContextForSpringReactor.java @@ -0,0 +1,21 @@ +package cn.dev33.satoken.reactor.spring; + +import cn.dev33.satoken.context.SaTokenContextForThreadLocal; + +/** + * Sa-Token 上下文处理器 [ Spring Reactor 版本实现 ] + * + * @author kong + * + */ +public class SaTokenContextForSpringReactor extends SaTokenContextForThreadLocal { + + /** + * 重写路由匹配方法 + */ + @Override + public boolean matchPath(String pattern, String path) { + return SaPathMatcherHolder.getPathMatcher().match(pattern, path); + } + +} diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java index 1dd98630..73af79fb 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java @@ -16,7 +16,6 @@ import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.log.SaLog; -import cn.dev33.satoken.log.input.SaLogInput; import cn.dev33.satoken.same.SaSameTemplate; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.solon.model.SaContextForSolon; @@ -36,8 +35,10 @@ public class XPluginImp implements Plugin { public void start(AopContext context) { //集成初始化 - // 注入上下文Bean - SaManager.setSaTokenContext(new SaContextForSolon()); + // Sa-Token 日志输出 Bean + context.getBeanAsyn(SaLog.class, bean -> { + SaManager.setLog(bean); + }); //注入配置Bean SaTokenConfig saTokenConfig = Solon.cfg().getBean("sa-token", SaTokenConfig.class); @@ -47,6 +48,8 @@ public class XPluginImp implements Plugin { SaManager.setConfig(bean); }); + // 注入上下文Bean + SaManager.setSaTokenContext(new SaContextForSolon()); // 注入Dao Bean context.getBeanAsyn(SaTokenDao.class, bean -> { @@ -104,16 +107,6 @@ public class XPluginImp implements Plugin { SaManager.setSaSignTemplate(bean); }); - // Sa-Token 日志输出 Bean - context.getBeanAsyn(SaLog.class, bean -> { - SaManager.setLog(bean); - }); - - // Sa-Token 日志接受 Bean - context.getBeanAsyn(SaLogInput.class, bean -> { - SaManager.setLogInput(bean); - }); - // 自定义 StpLogic 对象 context.getBeanAsyn(StpLogic.class, bean -> { StpUtil.setStpLogic(bean); diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java index 3f41c55d..6011c2ab 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java @@ -19,7 +19,6 @@ import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.log.SaLog; -import cn.dev33.satoken.log.input.SaLogInput; import cn.dev33.satoken.same.SaSameTemplate; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.stp.StpInterface; @@ -37,15 +36,23 @@ import cn.dev33.satoken.temp.SaTempInterface; public class SaBeanInject { /** - * 注入配置Bean + * 组件注入 + *

为确保 Log 组件正常打印,必须将 SaLog 和 SaTokenConfig 率先初始化

* * @param saTokenConfig 配置对象 */ - @Autowired(required = false) - public void setConfig(SaTokenConfig saTokenConfig) { - SaManager.setConfig(saTokenConfig); + public SaBeanInject( + @Autowired(required = false) SaLog log, + @Autowired(required = false) SaTokenConfig saTokenConfig + ){ + if(log != null) { + SaManager.setLog(log); + } + if(saTokenConfig != null) { + SaManager.setConfig(saTokenConfig); + } } - + /** * 注入持久化Bean * @@ -156,26 +163,6 @@ public class SaBeanInject { SaManager.setSaSignTemplate(saSignTemplate); } - /** - * 注入自定义的 日志输出 Bean - * - * @param log / - */ - @Autowired(required = false) - public void setLog(SaLog log) { - SaManager.setLog(log); - } - - /** - * 注入自定义的 日志接受 Bean - * - * @param logInput / - */ - @Autowired(required = false) - public void setLogInput(SaLogInput logInput) { - SaManager.setLogInput(logInput); - } - /** * 注入自定义的 StpLogic * @param stpLogic /