Sa-Token icon indicating copy to clipboard operation
Sa-Token copied to clipboard

SaTokenListener 自定义全局侦听器加载顺序问题

Open jiusun opened this issue 1 year ago • 4 comments

使用版本:

sa-token - 1.39.0 spring boot - 3.3.3

涉及的功能模块:

  • 全局侦听器 SaTokenListener
  • Redis集成 SaTokenDao
  • jackson组件 SaTokenDaoRedisJackson

测试步骤:

  • 我经过以下步骤测试: 使用 @Component 注册了一个自定义的全局侦听器,并监听全局组件注册事件 doRegisterComponent。代码如下:
@Component
public class MySaTokenListener extends SaTokenListenerForSimple {

    @Override
    public void doRegisterComponent(String compName, Object compObj) {
        System.out.println("compName = " + compName);
    }
}
  • 项目启动后得出以下结果:
2024-09-20T15:31:47.071+08:00  INFO 13976 ---  [           main] w.j.f.config.satoken.SaLogForSlf4j       : 全局组件 SaLog 载入成功: work.jiuri.framework.config.satoken.SaLogForSlf4j
2024-09-20T15:31:47.074+08:00  INFO 13976 ---  [           main] w.j.f.config.satoken.SaLogForSlf4j       : 全局配置 SaTokenConfig [tokenName=jiuri-admin2-token, timeout=86400, activeTimeout=1800, dynamicActiveTimeout=false, isConcurrent=true, isShare=true, maxLoginCount=12, maxTryTimes=12, isReadBody=true, isReadHeader=true, isReadCookie=true, isWriteHeader=false, tokenStyle=uuid, dataRefreshPeriod=30, tokenSessionCheckLogin=true, autoRenew=true, tokenPrefix=null, isPrint=false, isLog=true, logLevel=trace, logLevelInt=1, isColorLog=true, jwtSecretKey=null, httpBasic=, httpDigest=, currDomain=null, sameTokenTimeout=86400, checkSameToken=false, cookie=SaCookieConfig [domain=null, path=null, secure=false, httpOnly=false, sameSite=null], sign=SaSignConfig [secretKey=null, timestampDisparity=900000]] 
2024-09-20T15:31:47.077+08:00  INFO 13976 ---  [           main] w.j.f.config.satoken.SaLogForSlf4j       : 全局组件 SaTokenDao 载入成功: cn.dev33.satoken.dao.SaTokenDaoRedisJackson
2024-09-20T15:31:47.078+08:00  INFO 13976 ---  [           main] w.j.f.config.satoken.SaLogForSlf4j       : 全局组件 SaTokenContext 载入成功: cn.dev33.satoken.spring.SaTokenContextForSpringInJakartaServlet
2024-09-20T15:31:47.080+08:00  INFO 13976 ---  [           main] w.j.f.config.satoken.SaLogForSlf4j       : 全局组件 SaJsonTemplate 载入成功: cn.dev33.satoken.spring.json.SaJsonTemplateForJackson
compName = SaJsonTemplate

可以看到只有最后注册的 SaJsonTemplate 组件,才会被正常侦听。 通过debug发现自定义的侦听器并不是最先注册的,所以在注册之前发生的事件无法被正常侦听到

疑问

SaTokenEventCenter.registerListener(new MySaTokenListener()); 手动注册的没有这个问题。 是否可以提高通过 @Component 注册的自定义侦听器的的优先级,或者是否有其他方法可以手动提高优先级。

jiusun avatar Sep 20 '24 08:09 jiusun

你是什么需求,需要监听 doRegisterComponent 方法

click33 avatar Sep 20 '24 08:09 click33

你是什么需求,需要监听 doRegisterComponent 方法

一开始的需求是希望集成redis后可以给key添加一个自定义的前缀,而不是使用 tokenName。 所以想着在组件注册后修改一下 StringRedisTemplateRedisTemplate<String, Object>,这样就不用自己去实现 SaTokenDao。 然后就发现 doRegisterComponent 并不能监听到 SaTokenDaoRedisJackson 的注册。


rediskey添加自定义前缀的功能我已经实现了。 但是通过@Component注册的全局侦听器确实会因为注册顺序导致错过部分事件。 所以在这里提问一下。这是bug吗?或者是故意这样做的?

jiusun avatar Sep 23 '24 01:09 jiusun

现在没做顺序控制

click33 avatar Sep 23 '24 03:09 click33

现在没做顺序控制

可以支持下吗

JiangJiangYo avatar Nov 24 '24 12:11 JiangJiangYo