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);


}
相关推荐
FQNmxDG4S5 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje6 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv76 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫6 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287926 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本6 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211237 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯9 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188969 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java