Sa-Token 是一个轻量级 java 权限认证框架,次要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相干问题。
Gitee 开源地址:https://gitee.com/dromara/sa-token
本文将具体介绍 Sa-Token 中的不同 SaSession 对象的区别,以及各种不便的存取值的办法。
一、Session 是什么?
Session 是会话中业余的数据缓存组件,通过 Session 咱们能够很不便的缓存一些高频读写数据,进步程序性能,例如:
// 在登录时缓存user对象 StpUtil.getSession().set("user", user);// 而后咱们就能够在任意处应用这个user对象SysUser user = (SysUser) StpUtil.getSession().get("user");
在 Sa-Token 中,SaSession 分为三种,别离是:
User-Session
: 指的是框架为每个 账号id 调配的 SaSession。Token-Session
: 指的是框架为每个 token 调配的 SaSession。Custom-Session
: 指的是以一个 特定的值 作为SessionId,来调配的 Session。
假如三个客户端登录同一账号,且配置了不共享token,那么此时的Session模型是:
简而言之:
User-Session
以UserId为主,只有token指向的UserId统一,那么对应的Session对象就统一。Token-Session
以token为主,只有token不同,那么对应的Session对象就不同。Custom-Session
以特定的key为主,不同key对应不同的Session对象,同样的key指向同一个Session对象。
二、获取 User-Session
无关账号Session的API如下:
// 获取以后账号id的Session (必须是登录后能力调用)StpUtil.getSession();// 获取以后账号id的Session, 并决定在Session尚未创立时,是否新建并返回StpUtil.getSession(true);// 获取账号id为10001的SessionStpUtil.getSessionByLoginId(10001);// 获取账号id为10001的Session, 并决定在Session尚未创立时,是否新建并返回StpUtil.getSessionByLoginId(10001, true);// 获取SessionId为xxxx-xxxx的Session, 在Session尚未创立时, 返回null StpUtil.getSessionBySessionId("xxxx-xxxx");
三、获取 Token-Session
无关令牌Session的API如下:
// 获取以后 Token 的 Token-Session 对象StpUtil.getTokenSession();// 获取指定 Token 的 Token-Session 对象StpUtil.getTokenSessionByToken(token);
四、获取自定义Session
自定义Session指的是以一个特定的值
作为SessionId来调配的Session
, 借助自定义Session,你能够为零碎中的任意元素调配相应的session
例如以商品id作为key为每个商品调配一个Session,以便于缓存和商品相干的数据,其相干API如下:
// 查问指定key的Session是否存在SaSessionCustomUtil.isExists("goods-10001");// 获取指定key的Session,如果没有,则新建并返回SaSessionCustomUtil.getSessionById("goods-10001");// 获取指定key的Session,如果没有,第二个参数决定是否新建并返回 SaSessionCustomUtil.getSessionById("goods-10001", false); // 删除指定key的SessionSaSessionCustomUtil.deleteSessionById("goods-10001");
五、在 Session 上存取值
// 写值 session.set("name", "zhang"); // 写值 (只有在此key本来无值的时候才会写入)session.setDefaultValue("name", "zhang");// 取值session.get("name");// 取值 (指定默认值)session.get("name", "<defaultValue>"); // 取值 (若无值则执行参数办法, 之后将后果保留到此键名下,并返回此后果 若有值则间接返回, 无需执行参数办法)session.get("name", () -> { return ...; });// ---------- 数据类型转换: ----------session.getInt("age"); // 取值 (转int类型)session.getLong("age"); // 取值 (转long类型)session.getString("name"); // 取值 (转String类型)session.getDouble("result"); // 取值 (转double类型)session.getFloat("result"); // 取值 (转float类型)session.getModel("key", Student.class); // 取值 (指定转换类型)session.getModel("key", Student.class, <defaultValue>); // 取值 (指定转换类型, 并指定值为Null时返回的默认值)// 是否含有某个key (返回true或false)session.has("key"); // 删值 session.delete('name'); // 清空所有值 session.clear(); // 获取此 Session 的所有key (返回Set<String>)session.keys();
六、其它操作
// 返回此 Session 的id session.getId(); // 返回此 Session 的创立工夫 (工夫戳) session.getCreateTime(); // 返回此 Session 会话上的底层数据对象(如果更新map里的值,请调用session.update()办法防止产生脏数据)session.getDataMap(); // 将这个 Session 从长久库更新一下session.update(); // 登记此 Session 会话 (从长久库删除此Session)session.logout();
七、SaSession 环境隔离阐明
有同学常常会把 SaSession
与 HttpSession
进行混同,例如:
@PostMapping("/resetPoints")public void reset(HttpSession session) { // 在 HttpSession 上写入一个值 session.setAttribute("name", 66); // 在 SaSession 进行取值 System.out.println(StpUtil.getSession().get("name")); // 输入null}
要点:
SaSession
与HttpSession
没有任何关系,在HttpSession
上写入的值,在SaSession
中无奈取出。HttpSession
并未被框架接管,在应用Sa-Token时,请在任何状况下均应用SaSession
,不要应用HttpSession
。
八、未登录场景下获取 Token-Session
默认场景下,只有登录后能力通过 StpUtil.getTokenSession()
获取 Token-Session
。
如果想要在未登录场景下获取 Token-Session ,有两种办法:
- 办法一:将全局配置项
tokenSessionCheckLogin
改为 false。 - 办法二:应用匿名 Token-Session
// 获取以后 Token 的匿名 Token-Session (可在未登录状况下应用的 Token-Session)StpUtil.getAnonTokenSession();
留神点:如果前端没有提交 Token ,或者提交的 Token 是一个有效 Token 的话,框架将不会依据此 Token 创立 Token-Session
对象,
而是随机一个新的 Token 值来创立 Token-Session
对象,此 Token 值能够通过 StpUtil.getTokenValue()
获取到。
参考资料
- Sa-Token 文档:https://sa-token.cc
- Gitee 仓库地址:https://gitee.com/dromara/sa-token
- GitHub 仓库地址:https://github.com/dromara/sa-token