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 分配的 SessionToken-Session
: 指的是框架为每个 token 分配的 SessionCustom-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