Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。
Gitee 开源地址:https://gitee.com/dromara/sa-token
本文将详细介绍 Sa-Token 中的不同 SaSession 对象的区别,以及各种方便的存取值的方法。
(资料图片仅供参考)
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对象。有关账号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");有关令牌Session的API如下:
// 获取当前 Token 的 Token-Session 对象StpUtil.getTokenSession();// 获取指定 Token 的 Token-Session 对象StpUtil.getTokenSessionByToken(token);自定义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.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与 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。默认场景下,只有登录后才能通过 StpUtil.getTokenSession()获取 Token-Session。
如果想要在未登录场景下获取 Token-Session ,有两种方法:
tokenSessionCheckLogin改为 false。// 获取当前 Token 的匿名 Token-Session (可在未登录情况下使用的 Token-Session)StpUtil.getAnonTokenSession();注意点:如果前端没有提交 Token ,或者提交的 Token 是一个无效 Token 的话,框架将不会根据此 Token 创建 Token-Session对象,而是随机一个新的 Token 值来创建 Token-Session对象,此 Token 值可以通过 StpUtil.getTokenValue()获取到。
标签:
Sa-Token是一个轻量级java权限认证框架,主要解决登录认证、权限认...
原标题:苏丹停火协议再延5天双方仍有冲突苏丹冲突双方苏丹武装部队...
近日,多个网络平台发布“百辆收割机在河南高速上五六天,农民的损...
Redmi官方今日官宣了RedmiNote12TPro新机,该机将于明日(5月30日)...
诡异的贸易业务隐藏着什么?此次诈骗涉案金额较大,几乎吞噬公司一...
你们好,最近小品发现有诸多的小伙伴们对于密集物体恐惧症芝麻,密...
隐形变异是当前“四风”问题的突出特点。二十届中央纪委二次全会将...
吃完羊角蜜,很多人喉咙疼,是瓜太甜,还是农残太多?真相很残忍,甜...
内容正在升级改造,请稍后再试!【免责声明】本文仅代表合作供稿方...
1、进补一些防燥养阴食物秋冬适宜养阴,进入秋季可给小宝贝补一些防...
5月27日,北奔重汽与中铁飞豹达成2000台子母车协议,首批北奔牵引车...
近日,一名57岁中年女性,因胸闷、气促1月,加重3天,就近就诊于衡...
5月27日上午,郧阳区中医医院在子胥湖院区举办基层医院脑卒中康复规...
材料牛的后腿肉1000克左右、姜丝、大葱、料酒、花椒面、辣椒丝、盐...
深圳酷乐视科技有限公司,四川维优科技有限责任公司旗下,聚焦于LED...
中新网海南屯昌5月29日电(凌楠)海南省屯昌县新兴镇沙田村下辖的坡陈...
央视网消息:生态环境部今天(5月29日)发布了《2022中国生态环境状...
1、从13集开始。2、后面出现很多次。本文就为大家分享到这里,希望...
中国欢迎国外航天员参加中国空间站飞行任务
凯越(参数|询价)钥匙换电池教程是:首先将别克凯越遥控器钥匙侧过来...
国内商品期市夜盘开盘涨跌不一,沪锡涨超2%,铁矿石涨超1%;跌幅方...
本次任务,总台也在酒泉卫星发射中心发射场区设置了增强现实报道点...
乐居财经邓如菲5月29日消息,福田物业发展有限公司(以下简称“福田...
奇幻冒险电影《龙与地下城:侠盗荣耀》将于5月底在北美结束公映,北...
中金黄金:中金黄金股份有限公司2022年年度股东大会决议公告
多彩贵州网讯(本网记者骆文文王信)近日,记者走进位于遵义市高新...
想必现在有很多小伙伴对于闭的反义词和意思方面的知识都比较想要了...
1、狂暴飞车3D mp4希望采纳。本文就为大家分享到这里,希望小伙伴...
栏目名称:《廊坊新闻》首播频道:新闻综合频道首播时间:19:40重播...
每经AI快讯,有投资者在投资者互动平台提问:公司给哪些企业供应电...