Sa-Token中的SaSession对象使用学习示例详解

 更新时间:2023年07月18日 11:06:51   作者:省长[机智]  
这篇文章主要为大家介绍了Sa-Token中的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 环境隔离说明

有同学经常会把 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中的SaSession对象使用学习示例详解的详细内容,更多关于Sa-Token SaSession对象的资料请关注脚本之家其它相关文章!

相关文章

  • java并发等待条件的实现原理详解

    java并发等待条件的实现原理详解

    这篇文章主要介绍了java并发等待条件的实现原理详解,还是比较不错的,这里分享给大家,供需要的朋友参考。
    2017-11-11
  • Maven多模块及version修改的实现方法

    Maven多模块及version修改的实现方法

    这篇文章主要介绍了Maven多模块及version修改的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 使用JAXBContext 设置xml节点属性

    使用JAXBContext 设置xml节点属性

    这篇文章主要介绍了使用JAXBContext 设置xml节点属性的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring中的@Aspect注解使用详解

    Spring中的@Aspect注解使用详解

    这篇文章主要介绍了Spring中的@Aspect注解使用详解,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率,需要的朋友可以参考下
    2024-01-01
  • springboot配置Jackson返回统一默认值的实现示例

    springboot配置Jackson返回统一默认值的实现示例

    在项目开发中,我们返回的数据或者对象没有的时候一般直接返回的null,那么如何返回统一默认值,感兴趣的可以了解一下
    2021-07-07
  • Junit写法及与spring整合过程详解

    Junit写法及与spring整合过程详解

    这篇文章主要介绍了Junit写法及与spring整合过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 浅析JDBC的使用方法

    浅析JDBC的使用方法

    这篇文章主要介绍了JDBC的使用方法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-08-08
  • mybaits-plus lambdaQuery() 和 lambdaUpdate() 常见的使用方法

    mybaits-plus lambdaQuery() 和 lambdaUpdate() 常见的使用方法

    MyBatis-Plus是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章主要介绍了mybaits-plus lambdaQuery() 和 lambdaUpdate() 比较常见的使用方法,需要的朋友可以参考下
    2023-01-01
  • SpringBoot使用WebJars统一管理静态资源的方法

    SpringBoot使用WebJars统一管理静态资源的方法

    这篇文章主要介绍了SpringBoot使用WebJars统一管理静态资源的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • JUC三大辅助类CountDownLatch、CyclicBarrier和Semaphore详解

    JUC三大辅助类CountDownLatch、CyclicBarrier和Semaphore详解

    这篇文章主要介绍了JUC三大辅助类CountDownLatch、CyclicBarrier和Semaphore详解,CountDownLatch 类可以设置一个计数器,然后通过 countDown 方法来进行 减 1 的操作,使用 await 方法等待计数器不大于 0,然后继续执行 await 方法 之后的语句,需要的朋友可以参考下
    2024-01-01

最新评论