sa-token的session

sa-token的session

简介:sa-token的StpUtil.login(object),参数object会被转换为String类型存储,例如我想把一个User对象作为参数进行login,但StpUtil.getLoginId()的时候,返回的是user.toString()字符串,无法反序列化为User对象。

在了解sa-token的session之前,我是自己实现将User对象存储到redis中,在每个登录之后的请求中,在拦截器将User信息查询出来,放在ThreadLocal中。

直到刚刚看sa-token的文档,才看到它的session属性:

Session 是会话中专业的数据缓存组件,通过 Session 我们可以很方便的缓存一些高频读写数据,提高程序性能

在 Sa-Token 中,Session 分为三种,分别是:

  • Account-Session: 指的是框架为每个 账号id 分配的 Session
  • Token-Session: 指的是框架为每个 token 分配的 Session
  • Custom-Session: 指的是以一个 特定的值 作为SessionId,来分配的 Session

这里用Account-Session为例

1.示例代码

// 在登录时缓存 user 对象 
StpUtil.getSession().set("user", user);

// 然后我们就可以在任意处使用这个 user 对象
SysUser user = (SysUser) StpUtil.getSession().get("user");

2.存储在服务端缓存还是Redis

关于在sa-token存储在服务jvm缓存中还是在redis中,主要是看有没有引入redis做缓存,如果在项目中引入sa-token-redis依赖并配置正确的话,那么就会存储在redis中,如果没有引入redis,那么就会存在服务端缓存中。

例如在登录时我存进一个User对象

    // 测试登录,浏览器访问: http://localhost:8081/user/doLogin?username=zhang&password=123456
    @RequestMapping("doLogin")
    public String doLogin(String username, String password) {
        // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
        if("zhang".equals(username) && "123456".equals(password)) {
            StpUtil.login("10001");
            StpUtil.getSession().set("user",new User("10001","zhangsan"));
            return "登录成功";
        }
        return "登录失败";
    }

那么我在redis中的该登录的用户session值为

{
    @class:"cn.dev33.satoken.dao.SaSessionForJacksonCustomized",
    id:"satoken:login:session:10001",
    type:"Account-Session",
    loginType:"login",
    loginId:"10001",
    token:null,
    createTime:1700574068155,
    dataMap:{
        @class:"java.util.concurrent.ConcurrentHashMap",
        user:{
            @class:"com.example.satoken_demo.entity.User",
            id:"10001",
            name:"zhangsan"
        }
    },
    tokenSignList:[
        "java.util.Vector",
        [
            {
            @class:"cn.dev33.satoken.session.TokenSign",
            value:"8b200172-8e17-436e-92ab-80828ea025c9",
            device:"default-device",
            tag:null
            }
        ]
    ]
}

在这里插入图片描述

3.sa-token的setExtra()

sa-token在login的时候还可以携带SaLoginModel参数,例如

StpUtil.login("10001", SaLoginConfig.setExtra("username","helloworld").setExtra("password","123456"));

我以为这个setExtra可以存除了loginId之外的其他信息,但是实际操作下来,存储的值并不能通过StpUtil.getExtra("key")获取到。直到看到官网文档才知道,这个Extra是存储在jwt里的信息,需要结合jwt使用。

**sa-token默认使用UUID作为登录标识符(可理解为sessionId)。**但是也提供了和jwt作为标识符的方案,需要引入相关依赖和实现配置才能使用,而setExtra就是在jwt的payload中写入的值,因为我没有结合jwt,所以setExtra不生效。

至于如何结合jwt使用,这里不做赘述,可以看看官网,很是详细
链接:sa-token集成jwt

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值