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 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat1 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one2 小时前
算法--构造
java·数据结构·算法
SL_staff2 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff3 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko73 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.3 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff4 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河5 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目