首页 > 热点 > > 正文

【天天快播报】一文详解 Sa-Token 中的 SaSession 对象

时间:2023-05-30 15:52:52 来源:博客园

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", ""); // 取值 (若无值则执行参数方法, 之后将结果保存到此键名下,并返回此结果   若有值则直接返回, 无需执行参数方法)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, );  // 取值 (指定转换类型, 并指定值为Null时返回的默认值)// 是否含有某个key (返回true或false)session.has("key"); // 删值 session.delete("name");          // 清空所有值 session.clear();                 // 获取此 Session 的所有key (返回Set)session.keys();      

六、其它操作

// 返回此 Session 的id session.getId();                          // 返回此 Session 的创建时间 (时间戳) session.getCreateTime();                  // 返回此 Session 会话上的底层数据对象(如果更新map里的值,请调用session.update()方法避免产生脏数据)session.getDataMap();                     // 将这个 Session 从持久库更新一下session.update();                         // 注销此 Session 会话 (从持久库删除此Session)session.logout();                         

七、SaSession 环境隔离说明

有同学经常会把 SaSessionHttpSession进行混淆,例如:

@PostMapping("/resetPoints")public void reset(HttpSession session) {// 在 HttpSession 上写入一个值     session.setAttribute("name", 66);// 在 SaSession 进行取值    System.out.println(StpUtil.getSession().get("name"));// 输出null}

要点:

  1. SaSessionHttpSession没有任何关系,在HttpSession上写入的值,在SaSession中无法取出。
  2. 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
关键词:
x 广告
共同抗疫!郑州71岁党员志愿者每天爬6栋楼,提醒800多户居民做核酸

1月4日,郑州市新冠肺炎疫情防控指挥部办公室发布通告对部分区域实施管控措施。这是近半年来,新冠疫情第3次造访郑州。截止至1月10日24时,

安阳疫情最新消息|1月11日8时至12日8时安阳市新增本土确诊病例39例,累计123例

安阳疫情最新消息2022年1月11日8时至12日8时安阳市新型冠状病毒肺炎疫情最新情况1月11日8时至12日8时,全市新增本土确诊病例39例(汤阴县38

迅速高效!“河南抗疫互助通道”网上网下联动 获群众点赞

核酸检测24小时了还没查到结果,怎么办?现在高速下站口的管控政策到底是什么样子的?从洛阳老城区自驾走高速回郑州,收费站还劝返吗?苏八

信阳市疫情防控工作视频调度会召开 陈志伟出席会议

1月11日,市疫情防控工作视频调度会召开。代市长陈志伟出席会议并讲话。听取有关疫情防控重点工作和各县区(管理区、开发区)疫情防控工作

全国最新疫情消息:11日新增本土确诊病例166例 天津市今日启动第二轮全员核酸检测

11日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增新冠肺炎本土确诊病例166例(河南118例,其中安阳市65例、许昌市41例、

1月12日天津市放假半天 开启第二轮全员核酸检测

1月12日,天津市人民政府发布重要通告,为做好天津市第二轮全员核酸检测工作,全市机关和企事业单位于1月12日(星期三)下午放假半天。广大

x 广告

Copyright ©  2015-2023 京津冀评测网版权所有  备案号:京ICP备2022022245号-12   联系邮箱:434 922 62 @qq.com