解决Satoken(1.29.0+)组件关于session过期时间续期问题

解决Satoken(1.29.0+)组件关于token过期时间续期问题(续签问题)

注意:笔者使用的SaToken版本为:1.34.0 (根据官方文档,以下解决方案适用于1.29.0+!)

hello 各位小伙伴,我是爱抄中间件代码的路人丙

最近在生产环境遇到一个关于使用第三方开源组件satoken的问题:token过期时间续签,想跟大家分享一下类似问题的通用解决思路。

阅读本篇文章,你将获得以下收获:

  • 如何使用satoken组件支持token过期时间续签

  • 遇到第三方组件出现问题,我们如何解决问题思路(这只是笔者目前认知总结的通用思路)

    如果你只是想理解解决这个问题:如何使用satoken解决session续签问题,那么你直接抄下面的代码即可:


@Configuration
@Slf4j
public class SaTokenConfigure implements WebMvcConfigurer {

    @Autowired
    private SaTokenConfig saTokenConfig;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器,定义详细认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
                    SaRouter.notMatch(mergeUrls())
                            .check(r -> {
                                StpUtil.checkLogin(); // satoken 校验登录
                                log.info("更新前,当前登录有效时间:"  + StpUtil.getTokenTimeout());
                                StpUtil.renewTimeout(saTokenConfig.getTimeout()); // 更新过期时间
                                log.info("更新后,当前登录有效时间:"  + StpUtil.getTokenTimeout());
                            });                                        // 要执行的校验动作,可以写完整的 lambda 表达式
                }).isAnnotation(false)                                // 关闭注解的方式,只用路由拦截
        ).addPathPatterns("/**");                                     // 所有接口都需要认证
    }


}

看到这里是不是觉得很简单,就加了一行代码就可以支持token过期时间续签了:

 StpUtil.renewTimeout(saTokenConfig.getTimeout()); // 更新过期时间

那在这里笔者想提2个问题?

  • 问题1:为什么加上这行代码 StpUtil.renewTimeout(saTokenConfig.getTimeout());就可以续签了呢?
  • 问题2:为什么renewTimeout()方法传递的参数是saTokenConfig.getTimeout(),而不是其他呢?

如果你能尝试着回答这2个问题,我只能说接下来的内容没有必要看了(大佬求放过!)

1、问题描述:在使用satoken时,想让其支持token续签功能

这个问题是测试同学发现的:在进行功能测试的时候,反馈不停的操作,但是token任然过期问题。

简单说就是:假设设置了token过期时间60s,但是我一直在不停的调用后端服务的接口(每一次调用的间隔都在60s内),理论上来说,我的token不应该过期,但是从登录60s过后,我被提示“未登录,即token过期”,这个就是我们在使用satoken遇到的问题。

事实上,这个问题不难,但是笔者认为解决它的思路比解决它更重要(笔者已经借鉴这套思路解决了好几个类似的疑难问题)

2、那么我们应该如何解决问题

首先笔者先给大家分享一下解决这个问题的思路

  • (1)检查自己当前使用的yml配置文件是否正确使用以及配置正确的satoken
  • (2)如果确定配置无误,然后去组件的官方文档查看组件是否支持token过期时间“续签”功能
  • (3)文档未找到具体解决续签的问题,那么就去组件开源仓库的issue中搜索关键词
  • (4)如果以上步骤还不能解决,则只能进行源码阅读尝试了解组件整体流程从而去定位问题并解决问题

事实上,笔者在步骤(2)、(3)中就看到了解决这个问题的一些启发信息,所以最后通过些许源码阅读以及简单的代码修改,最后解决了这个问题,并顺便提交了这个issue问题,希望satoken开源官方能够更明显的让读者知道如何去解决这个问题(比如官方文档)

3 、笔者如何解决这个问题的过程
第(1)步,就步说了,大家仔细检查即可
第(2)步,打开对应组件官方文档:https://sa-token.cc/v/v1.34.0/doc.html#/

笔者使用的satoken版本为:Sa-Token v1.34.0

如下图所示,很快就能看到satoken支持的功能目录(官方文档还是非常的清晰的)

在这里插入图片描述

根据:“自动续签”关键词,我们全局搜索一下,看能不能找到一些代码

但是遗憾的是,笔者搜索了以下几个关键词:“Token过期策略”、“过期策略”、“自动续签”、“续签”,都没有找到如何"续签"的代码。(有点难受)

然后笔者尝试在左边的目录能看出点相关信息,事实上也没有收获!

但是笔者还是再坚持看了看文档:

在这里插入图片描述

看到这里应该明白了,1.29以上的版本官方已经支持timeout续签问题解决方案(官方要是给个代码示例就更好了)

第(3)步,看看是不是有人遇到过类似的问题?

打开satoken的gitee or github

在这里插入图片描述

很明显,有其他的小伙伴也遇到了类似的问题,而且笔者看这个问题的时候还是代办的

(其实这个“啊杰”同学其实已经说了解决这个问题的答案!!!)

根据步骤(2)、(3)简单总结一下:关于token timeout续签问题

  • 官方给出的答案是:1.29支持续签,但是没有给出代码示例
  • 开源社区:有小伙伴提出了解决这个问题的信息,但是也没有给出代码示例

很明显,到这里,这个问题其实就已经可以解决了,我们只需要在satoken的链路中的某个环节加上官方给出的续签方法即可:StpUtil.renewTimeout(100),如下图:

在这里插入图片描述

具体怎么解决呢?大家如果还有印象的话,笔者最开始就把解决方案的代码贴出来了

每次token校验之后,给token续签一下即可:代码如下,16行

@Configuration
@Slf4j
public class SaTokenConfigure implements WebMvcConfigurer {

    @Autowired
    private SaTokenConfig saTokenConfig;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器,定义详细认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
                    SaRouter.notMatch(mergeUrls())
                            .check(r -> {
                                StpUtil.checkLogin(); // satoken 校验登录
                                log.info("更新前,当前登录有效时间:"  + StpUtil.getTokenTimeout());
                                StpUtil.renewTimeout(saTokenConfig.getTimeout()); // 更新过期时间
                                log.info("更新后,当前登录有效时间:"  + StpUtil.getTokenTimeout());
                            });                                        // 要执行的校验动作,可以写完整的 lambda 表达式
                }).isAnnotation(false)                                // 关闭注解的方式,只用路由拦截
        ).addPathPatterns("/**");                                     // 所有接口都需要认证
    }


}

看到这里,是不是觉得很简单!(相信到这里,笔者提出的第一个问题就有答案了)

那么下一个问题是,官方给出的方法塞的是100,那我应该塞多少呢?为什么笔者塞的是saTokenConfig.getTimeout()呢?(这也是笔者前面提到的第二个问题!)

4、 StpUtil.renewTimeout()方法应该塞什么才好呢?

saTokenConfig这个实列是笔者通过注入的方式拿到的,意思就是这个SaTokenConfig是注入进去的(但是这个不是笔者注入进去的,而是satoken注入的)

接下来我们看看,其实有一些经验的同学都知道,一般的第三方组件(Java相关的)都会封装一个xxx-spring-boot-starter,satoken也不例外,接下来,笔者直接贴找到SaTokenConfig类的图了(笔者最开始也不知道satoken的配置类叫什么,反正知道肯定有一个配置类-封装过stater的同学肯定很熟悉了)

以下贴图是笔者从内网拷贝出来的有点糊,将就看一下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5 总结

很明显,这个问题,笔者走到第三步基本就有解决思路了,其实有时候,我们可能还需要第4步,就是深入对应的源码处进行问题定位和解决,笔者想跟大家分享的一个观点就是:遇到第三方组件问题不要害怕,不管这个组件多牛,它也还是一行一行代码写出来的,我们能做的就是:一步一步耐心的去定位问题、验证问题,最后解决问题!

好了,如果你觉得本篇文章对你有一点点的帮助,非常欢迎你的评论和点赞!

埋下伏笔:大家如果对这种系列的分享感兴趣的话,笔者后面会抽时间分享笔者在生产上如何通过深入第三方组件源码去定位以及解决问题(非Java语言组件,但是解决问题的思路以及方法论都是相通的)!

  • 31
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值