From ce5b46f9a1022e69683957f96f3e1ad12e0a9f62 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Sat, 20 Aug 2022 02:44:01 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BE=A6=E5=90=AC=E5=99=A8?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=94=B9=E4=B8=BA=E4=BA=8B=E4=BB=B6=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E5=8F=91=E5=B8=83=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/dev33/satoken/SaManager.java | 20 -- .../satoken/listener/SaTokenEventRelease.java | 218 ++++++++++++++++++ ...va => SaTokenListenerForConsolePrint.java} | 4 +- .../listener/SaTokenListenerForSimple.java | 55 +++++ .../cn/dev33/satoken/session/SaSession.java | 9 +- .../java/cn/dev33/satoken/stp/StpLogic.java | 41 ++-- .../satoken/jwt/StpLogicJwtForStateless.java | 6 +- .../satoken/reactor/spring/SaBeanInject.java | 9 +- .../cn/dev33/satoken/solon/XPluginImp.java | 6 +- .../cn/dev33/satoken/spring/SaBeanInject.java | 9 +- 10 files changed, 322 insertions(+), 55 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventRelease.java rename sa-token-core/src/main/java/cn/dev33/satoken/listener/{SaTokenListenerDefaultImpl.java => SaTokenListenerForConsolePrint.java} (94%) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForSimple.java 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 90bf2248..1185a889 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 @@ -13,8 +13,6 @@ import cn.dev33.satoken.dao.SaTokenDaoDefaultImpl; import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.json.SaJsonTemplateDefaultImpl; -import cn.dev33.satoken.listener.SaTokenListener; -import cn.dev33.satoken.listener.SaTokenListenerDefaultImpl; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.sign.SaSignTemplateDefaultImpl; import cn.dev33.satoken.stp.StpInterface; @@ -140,24 +138,6 @@ public class SaManager { return SaTokenContextDefaultImpl.defaultContext; } - /** - * 侦听器 Bean - */ - private volatile static SaTokenListener saTokenListener; - public static void setSaTokenListener(SaTokenListener saTokenListener) { - SaManager.saTokenListener = saTokenListener; - } - public static SaTokenListener getSaTokenListener() { - if (saTokenListener == null) { - synchronized (SaManager.class) { - if (saTokenListener == null) { - setSaTokenListener(new SaTokenListenerDefaultImpl()); - } - } - } - return saTokenListener; - } - /** * 临时令牌验证模块 Bean */ diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventRelease.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventRelease.java new file mode 100644 index 00000000..e0442d52 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventRelease.java @@ -0,0 +1,218 @@ +package cn.dev33.satoken.listener; + +import java.util.ArrayList; +import java.util.List; + +import cn.dev33.satoken.exception.SaTokenException; +import cn.dev33.satoken.stp.SaLoginModel; + +/** + * Sa-Token 事件发布器 + * + * @author kong + * @since: 2022-8-19 + */ +public class SaTokenEventRelease { + + // --------- 注册侦听器 + + private static List listenerList = new ArrayList<>(); + + static { + // 默认添加控制台日志侦听器 + listenerList.add(new SaTokenListenerForConsolePrint()); + } + + /** + * 获取已注册的所有侦听器 + * @return / + */ + public static List getListenerList() { + return listenerList; + } + + /** + * 重置侦听器集合 + * @param listenerList / + */ + public static void setListenerList(List listenerList) { + if(listenerList == null) { + throw new SaTokenException("重置的侦听器集合不可以为空"); + } + SaTokenEventRelease.listenerList = listenerList; + } + + /** + * 注册一个侦听器 + * @param listener / + */ + public static void registerListener(SaTokenListener listener) { + if(listener == null) { + throw new SaTokenException("注册的侦听器不可以为空"); + } + listenerList.add(listener); + } + + /** + * 注册一组侦听器 + * @param listenerList / + */ + public static void registerListenerList(List listenerList) { + if(listenerList == null) { + throw new SaTokenException("注册的侦听器不可以为空"); + } + for (SaTokenListener listener : listenerList) { + if(listener == null) { + throw new SaTokenException("注册的侦听器不可以为空"); + } + } + SaTokenEventRelease.listenerList.addAll(listenerList); + } + + /** + * 移除一个侦听器 + * @param listener / + */ + public static void removeListener(SaTokenListener listener) { + listenerList.remove(listener); + } + + /** + * 移除指定类型的所有侦听器 + * @param cls / + */ + public static void removeListener(Class cls) { + ArrayList listenerListCopy = new ArrayList<>(listenerList); + for (SaTokenListener listener : listenerListCopy) { + if(cls.isAssignableFrom(listener.getClass())) { + listenerList.remove(listener); + } + } + } + + /** + * 清空所有已注册的侦听器 + */ + public static void clearListener() { + listenerList.clear(); + } + + /** + * 判断是否已经注册了指定侦听器 + * @param listener / + * @return / + */ + public static boolean hasListener(SaTokenListener listener) { + return listenerList.contains(listener); + } + + /** + * 判断是否已经注册了指定类型的侦听器 + * @param cls / + * @return / + */ + public static boolean hasListener(Class cls) { + for (SaTokenListener listener : listenerList) { + if(cls.isAssignableFrom(listener.getClass())) { + return true; + } + } + return false; + } + + + // --------- 事件发布 + + /** + * 每次登录时触发 + * @param loginType 账号类别 + * @param loginId 账号id + * @param tokenValue 本次登录产生的 token 值 + * @param loginModel 登录参数 + */ + public static void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + for (SaTokenListener listener : listenerList) { + listener.doLogin(loginType, loginId, tokenValue, loginModel); + } + } + + /** + * 每次注销时触发 + * @param loginType 账号类别 + * @param loginId 账号id + * @param tokenValue token值 + */ + public static void doLogout(String loginType, Object loginId, String tokenValue) { + for (SaTokenListener listener : listenerList) { + listener.doLogout(loginType, loginId, tokenValue); + } + } + + /** + * 每次被踢下线时触发 + * @param loginType 账号类别 + * @param loginId 账号id + * @param tokenValue token值 + */ + public static void doKickout(String loginType, Object loginId, String tokenValue) { + for (SaTokenListener listener : listenerList) { + listener.doKickout(loginType, loginId, tokenValue); + } + } + + /** + * 每次被顶下线时触发 + * @param loginType 账号类别 + * @param loginId 账号id + * @param tokenValue token值 + */ + public static void doReplaced(String loginType, Object loginId, String tokenValue) { + for (SaTokenListener listener : listenerList) { + listener.doReplaced(loginType, loginId, tokenValue); + } + } + + /** + * 每次被封禁时触发 + * @param loginType 账号类别 + * @param loginId 账号id + * @param disableTime 封禁时长,单位: 秒 + */ + public static void doDisable(String loginType, Object loginId, long disableTime) { + for (SaTokenListener listener : listenerList) { + listener.doDisable(loginType, loginId, disableTime); + } + } + + /** + * 每次被解封时触发 + * @param loginType 账号类别 + * @param loginId 账号id + */ + public static void doUntieDisable(String loginType, Object loginId) { + for (SaTokenListener listener : listenerList) { + listener.doUntieDisable(loginType, loginId); + } + } + + /** + * 每次创建Session时触发 + * @param id SessionId + */ + public static void doCreateSession(String id) { + for (SaTokenListener listener : listenerList) { + listener.doCreateSession(id); + } + } + + /** + * 每次注销Session时触发 + * @param id SessionId + */ + public static void doLogoutSession(String id) { + for (SaTokenListener listener : listenerList) { + listener.doLogoutSession(id); + } + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java similarity index 94% rename from sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerDefaultImpl.java rename to sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java index d895b658..c13229c2 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForConsolePrint.java @@ -7,11 +7,11 @@ import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.util.SaFoxUtil; /** - * Sa-Token 侦听器的默认实现:log打印 + * Sa-Token 侦听器实现:控制台 log 打印 * @author kong * */ -public class SaTokenListenerDefaultImpl implements SaTokenListener { +public class SaTokenListenerForConsolePrint implements SaTokenListener { /** * 每次登录时触发 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForSimple.java b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForSimple.java new file mode 100644 index 00000000..3ad3b7a6 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForSimple.java @@ -0,0 +1,55 @@ +package cn.dev33.satoken.listener; + +import cn.dev33.satoken.stp.SaLoginModel; + +/** + * Sa-Token 侦听器,默认空实现 + * + *

对所有事件方法提供空实现,方便开发者通过继承此类快速实现一个可用的侦听器 + * + * @author kong + * @since: 2022-8-20 + */ +public class SaTokenListenerForSimple implements SaTokenListener { + + @Override + public void doLogin(String loginType, Object loginId, String tokenValue, SaLoginModel loginModel) { + + } + + @Override + public void doLogout(String loginType, Object loginId, String tokenValue) { + + } + + @Override + public void doKickout(String loginType, Object loginId, String tokenValue) { + + } + + @Override + public void doReplaced(String loginType, Object loginId, String tokenValue) { + + } + + @Override + public void doDisable(String loginType, Object loginId, long disableTime) { + + } + + @Override + public void doUntieDisable(String loginType, Object loginId) { + + } + + @Override + public void doCreateSession(String id) { + + } + + @Override + public void doLogoutSession(String id) { + + } + +} 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 83242afa..ce6293f5 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 @@ -11,6 +11,7 @@ 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.listener.SaTokenEventRelease; import cn.dev33.satoken.util.SaFoxUtil; /** @@ -71,8 +72,8 @@ public class SaSession implements SaSetValueInterface, Serializable { public SaSession(String id) { this.id = id; this.createTime = System.currentTimeMillis(); - // $$ 通知监听器 - SaManager.getSaTokenListener().doCreateSession(id); + // $$ 发布事件 + SaTokenEventRelease.doCreateSession(id); } /** @@ -231,8 +232,8 @@ public class SaSession implements SaSetValueInterface, Serializable { /** 注销Session (从持久库删除) */ public void logout() { SaManager.getSaTokenDao().deleteSession(this.id); - // $$ 通知监听器 - SaManager.getSaTokenListener().doLogoutSession(id); + // $$ 发布事件 + SaTokenEventRelease.doLogoutSession(id); } /** 当Session上的tokenSign数量为零时,注销会话 */ 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 4bcf9354..633745ac 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 @@ -1,5 +1,10 @@ package cn.dev33.satoken.stp; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + import cn.dev33.satoken.SaManager; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; @@ -21,17 +26,13 @@ import cn.dev33.satoken.exception.NotRoleException; import cn.dev33.satoken.exception.NotSafeException; import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.fun.SaFunction; +import cn.dev33.satoken.listener.SaTokenEventRelease; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.session.TokenSign; import cn.dev33.satoken.strategy.SaStrategy; import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaTokenConsts; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - /** * Sa-Token 权限认证,逻辑实现类 * @author kong @@ -362,8 +363,8 @@ public class StpLogic { // 写入 [token-last-activity] setLastActivityToNow(tokenValue); - // $$ 通知监听器,账号xxx 登录成功 - SaManager.getSaTokenListener().doLogin(loginType, id, tokenValue, loginModel); + // $$ 发布事件:账号xxx 登录成功 + SaTokenEventRelease.doLogin(loginType, id, tokenValue, loginModel); // 检查此账号会话数量是否超出最大值 if(config.getMaxLoginCount() != -1) { @@ -427,7 +428,8 @@ public class StpLogic { // 删除Token-Id映射 & 清除Token-Session deleteTokenToIdMapping(tokenValue); deleteTokenSession(tokenValue); - SaManager.getSaTokenListener().doLogout(loginType, loginId, tokenValue); + // $$ 发布事件:指定账号注销 + SaTokenEventRelease.doLogout(loginType, loginId, tokenValue); } // 注销 Session session.logoutByTokenSignCountToZero(); @@ -463,7 +465,8 @@ public class StpLogic { // 删除Token-Id映射 & 清除Token-Session deleteTokenToIdMapping(tokenValue); deleteTokenSession(tokenValue); - SaManager.getSaTokenListener().doLogout(loginType, loginId, tokenValue); + // $$ 发布事件:指定账号注销 + SaTokenEventRelease.doLogout(loginType, loginId, tokenValue); } // 注销 Session session.logoutByTokenSignCountToZero(); @@ -492,8 +495,8 @@ public class StpLogic { return; } - // $$ 通知监听器,某某Token注销下线了 - SaManager.getSaTokenListener().doLogout(loginType, loginId, tokenValue); + // $$ 发布事件:某某Token注销下线了 + SaTokenEventRelease.doLogout(loginType, loginId, tokenValue); // 4. 清理User-Session上的token签名 & 尝试注销User-Session SaSession session = getSessionByLoginId(loginId, false); @@ -530,7 +533,7 @@ public class StpLogic { clearLastActivity(tokenValue); // 将此 token 标记为已被踢下线 updateTokenToIdMapping(tokenValue, NotLoginException.KICK_OUT); - SaManager.getSaTokenListener().doKickout(loginType, loginId, tokenValue); + SaTokenEventRelease.doKickout(loginType, loginId, tokenValue); } // 注销 Session session.logoutByTokenSignCountToZero(); @@ -558,8 +561,8 @@ public class StpLogic { // 3. 给token打上标记:被踢下线 updateTokenToIdMapping(tokenValue, NotLoginException.KICK_OUT); - // $$. 否则通知监听器,某某Token被踢下线了 - SaManager.getSaTokenListener().doKickout(loginType, loginId, tokenValue); + // $$. 发布事件:某某Token被踢下线了 + SaTokenEventRelease.doKickout(loginType, loginId, tokenValue); // 4. 清理User-Session上的token签名 & 尝试注销User-Session SaSession session = getSessionByLoginId(loginId, false); @@ -586,7 +589,7 @@ public class StpLogic { clearLastActivity(tokenValue); // 将此 token 标记为已被顶替 updateTokenToIdMapping(tokenValue, NotLoginException.BE_REPLACED); - SaManager.getSaTokenListener().doReplaced(loginType, loginId, tokenValue); + SaTokenEventRelease.doReplaced(loginType, loginId, tokenValue); } } } @@ -1651,8 +1654,8 @@ public class StpLogic { // 标注为已被封禁 getSaTokenDao().set(splicingKeyDisable(loginId), DisableLoginException.BE_VALUE, disableTime); - // $$ 通知监听器 - SaManager.getSaTokenListener().doDisable(loginType, loginId, disableTime); + // $$ 发布事件 + SaTokenEventRelease.doDisable(loginType, loginId, disableTime); } /** @@ -1680,8 +1683,8 @@ public class StpLogic { public void untieDisable(Object loginId) { getSaTokenDao().delete(splicingKeyDisable(loginId)); - // $$ 通知监听器 - SaManager.getSaTokenListener().doUntieDisable(loginType, loginId); + // $$ 发布事件 + SaTokenEventRelease.doUntieDisable(loginType, loginId); } diff --git a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java index 755d1eca..dcc81e68 100644 --- a/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java +++ b/sa-token-plugin/sa-token-jwt/src/main/java/cn/dev33/satoken/jwt/StpLogicJwtForStateless.java @@ -2,12 +2,12 @@ package cn.dev33.satoken.jwt; import java.util.Map; -import cn.dev33.satoken.SaManager; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.exception.ApiDisabledException; import cn.dev33.satoken.exception.SaTokenException; import cn.dev33.satoken.jwt.exception.SaJwtException; +import cn.dev33.satoken.listener.SaTokenEventRelease; import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.SaTokenInfo; import cn.dev33.satoken.stp.StpLogic; @@ -98,8 +98,8 @@ public class StpLogicJwtForStateless extends StpLogic { // ------ 2、生成一个token String tokenValue = createTokenValue(id, loginModel.getDeviceOrDefault(), loginModel.getTimeout(), loginModel.getExtraData()); - // $$ 通知监听器,账号xxx 登录成功 - SaManager.getSaTokenListener().doLogin(loginType, id, tokenValue, loginModel); + // $$ 发布事件:账号xxx 登录成功 + SaTokenEventRelease.doLogin(loginType, id, tokenValue, loginModel); return tokenValue; } 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 ffd93abf..a4995197 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 @@ -1,5 +1,7 @@ package cn.dev33.satoken.reactor.spring; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.util.PathMatcher; @@ -14,6 +16,7 @@ import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.id.SaIdTemplate; import cn.dev33.satoken.id.SaIdUtil; import cn.dev33.satoken.json.SaJsonTemplate; +import cn.dev33.satoken.listener.SaTokenEventRelease; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.stp.StpInterface; @@ -82,11 +85,11 @@ public class SaBeanInject { /** * 注入侦听器Bean * - * @param saTokenListener saTokenListener对象 + * @param listenerList 侦听器集合 */ @Autowired(required = false) - public void setSaTokenListener(SaTokenListener saTokenListener) { - SaManager.setSaTokenListener(saTokenListener); + public void setSaTokenListener(List listenerList) { + SaTokenEventRelease.registerListenerList(listenerList); } /** 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 1e7a9786..5bee28d5 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 @@ -14,6 +14,7 @@ import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.id.SaIdTemplate; import cn.dev33.satoken.id.SaIdUtil; import cn.dev33.satoken.json.SaJsonTemplate; +import cn.dev33.satoken.listener.SaTokenEventRelease; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.solon.model.SaContextForSolon; @@ -63,8 +64,10 @@ public class XPluginImp implements Plugin { }); // 注入侦听器 Bean + // TODO:这里需要改为注入一组 Bean context.getWrapAsyn(SaTokenListener.class, bw->{ - SaManager.setSaTokenListener(bw.raw()); +// SaManager.setSaTokenListener(bw.raw()); + SaTokenEventRelease.registerListener(bw.raw()); }); // 注入权限认证 Bean @@ -107,4 +110,5 @@ public class XPluginImp implements Plugin { StpUtil.setStpLogic(bw.raw()); }); } + } \ No newline at end of file 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 55529555..cea91671 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 @@ -1,5 +1,7 @@ package cn.dev33.satoken.spring; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.util.PathMatcher; @@ -14,6 +16,7 @@ import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.id.SaIdTemplate; import cn.dev33.satoken.id.SaIdUtil; import cn.dev33.satoken.json.SaJsonTemplate; +import cn.dev33.satoken.listener.SaTokenEventRelease; import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.stp.StpInterface; @@ -82,11 +85,11 @@ public class SaBeanInject { /** * 注入侦听器Bean * - * @param saTokenListener saTokenListener对象 + * @param listenerList 侦听器集合 */ @Autowired(required = false) - public void setSaTokenListener(SaTokenListener saTokenListener) { - SaManager.setSaTokenListener(saTokenListener); + public void setSaTokenListener(List listenerList) { + SaTokenEventRelease.registerListenerList(listenerList); } /**