Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jiusun opened this issue Sep 20, 2024 · 3 comments
Open

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

jiusun opened this issue Sep 20, 2024 · 3 comments

Comments

@jiusun
Copy link

jiusun commented Sep 20, 2024

使用版本:

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 注册的自定义侦听器的的优先级,或者是否有其他方法可以手动提高优先级。

@click33
Copy link
Collaborator

click33 commented Sep 20, 2024

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

@jiusun
Copy link
Author

jiusun commented Sep 23, 2024

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

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


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

@click33
Copy link
Collaborator

click33 commented Sep 23, 2024

现在没做顺序控制

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants