乐趣区

关于java:一文详解-SaToken-中的-SaSession-对象

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 的 Session
StpUtil.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 的 Session
SaSessionCustomUtil.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 环境隔离阐明

有同学常常会把 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
退出移动版