Sa-Token 多账号体系下Redis持久化问题

在使用Sa-Token框架实现多账号体系时,当后端服务重启后,系统报错"未能获取对应StpLogic,type=XXX"。这种情况通常发生在配置了Redis持久化存储的场景下,特别是在多账号体系中使用自定义的StpLogic时。

这个问题的本质在于Sa-Token的多账号体系实现机制与Redis持久化存储之间的协同工作方式。当开发者定义了一个新的StpLogic实例(如ADMIN = new StpLogic("ADMIN"))时,这个定义仅存在于JVM内存中。服务重启后,虽然Redis中存储的Token数据仍然存在,但JVM中的StpLogic实例定义已经丢失。

原本实现代码:

java 复制代码
package com.example.auth.service;

import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;

/**
 * StpLogic 门面类,管理项目中所有的 StpLogic 账号体系
 */
public class StpKit {

    public static final String USER_TYPE = "client";
    public static final String xxx_TYPE = "xxx";


    /**
     * 默认原生会话对象
     */
    public static final StpLogic DEFAULT = StpUtil.stpLogic;


    /**
     * User 会话对象,管理 client 类型所有账号的登录、权限认证
     */
    public static final StpLogic USER = new StpLogic(USER_TYPE);

    /**
     * xxx 会话对象
     */
    public static final StpLogic xxx = new StpLogic(xxx_TYPE);


}

解决方案

在StpLogic门面类上加入@Component注解即可。

java 复制代码
package com.example.auth.service;

import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.stereotype.Component;

/**
 * StpLogic 门面类,管理项目中所有的 StpLogic 账号体系
 */
@Component
public class StpKit {

    public static final String USER_TYPE = "client";
    public static final String xxx_TYPE = "xxx";


    /**
     * 默认原生会话对象
     */
    public static final StpLogic DEFAULT = StpUtil.stpLogic;


    /**
     * User 会话对象,管理 client 类型所有账号的登录、权限认证
     */
    public static final StpLogic USER = new StpLogic(USER_TYPE);

    /**
     * xxx 会话对象
     */
    public static final StpLogic xxx = new StpLogic(xxx_TYPE);


}
相关推荐
之歆1 分钟前
Spring AI入门到实战到原理源码-MCP
java·人工智能·spring
yangminlei21 分钟前
Spring Boot3集成LiteFlow!轻松实现业务流程编排
java·spring boot·后端
qq_3181215922 分钟前
互联网大厂Java面试故事:从Spring Boot到微服务架构的技术挑战与解答
java·spring boot·redis·spring cloud·微服务·面试·内容社区
J_liaty30 分钟前
Spring Boot整合Nacos:从入门到精通
java·spring boot·后端·nacos
阿蒙Amon1 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
daidaidaiyu1 小时前
Spring IOC 源码学习 一文学习完整的加载流程
java·spring
2***d8852 小时前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端
五阿哥永琪2 小时前
Spring中的定时任务怎么用?
java·后端·spring
gelald2 小时前
AQS 工具之 CountDownLatch 与 CyclicBarry 学习笔记
java·后端·源码阅读
better_liang2 小时前
每日Java面试场景题知识点之-XXL-JOB分布式任务调度实践
java·spring boot·xxl-job·分布式任务调度·企业级开发