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


}
相关推荐
Swift社区几秒前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
阿波罗尼亚1 小时前
复杂查询:直接查询/子查询/视图/CTE
java·前端·数据库
goTsHgo1 小时前
Spring XML 配置简介
xml·java·spring
青柠编程1 小时前
基于 Spring Boot 的医疗病历信息交互平台架构设计
java·spring boot·后端
专注代码七年1 小时前
IDEA JVM优化配置idea64.vmoptions - 保守兼容版本 兼容IDEA 2023.3.6版本【亲测可用】
java·jvm·intellij-idea
疯癫的老码农2 小时前
【word解析】Java文件解析问题排查:无法找到OMML2MML.xsl的IO异常解析
java·开发语言·spring boot·spring·maven
songx_992 小时前
leetcode(填充每个节点的下一个右侧节点指针 II)
java·数据结构·算法·leetcode
花心蝴蝶.3 小时前
JVM 内存结构
java·开发语言·jvm
lichong9513 小时前
【大前端++】Android studio Log日志高对比度配色方案
android·java·前端·json·android studio·大前端·大前端++
97zz3 小时前
实战排查:Java 解析 Excel 大型 导致内存溢出问题的完整解决过程
java·开发语言·spring boot·excel