sa-token/sa-token-doc/doc/use/session.md
2021-04-17 17:08:02 +08:00

5.2 KiB
Raw Blame History

Session会话


Session是什么

Session是会话中专业的数据缓存组件通过Session我们可以很方便的缓存一些高频读写数据,提高程序性能
sa-token中, Session 分为三种, 分别是:

  • User-Session: 指的是框架为每个loginId分配的Session
  • Token-Session: 指的是框架为每个token分配的Session
  • 自定义Session: 指的是以一个特定的值作为SessionId来分配的Session

有关User-Session与Token-Session的详细区别请参考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的专属Session 
StpUtil.getTokenSession();

// 获取指定token的专属Session 
StpUtil.getTokenSessionByToken(token);

在未登录状态下是否可以获取Token-Session?这取决于你配置的tokenSessionCheckLogin值是否为false详见框架配置

自定义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相关操作

那么获取到的SaSession具体有哪些方法可供操作?

// 返回此Session的id 
session.getId();                          

// 返回此Session的创建时间 (时间戳) 
session.getCreateTime();                  

// 在Session上获取一个值 
session.getAttribute('name');             

// 在Session上获取一个值并指定取不到值时返回的默认值
session.getAttribute('name', 'zhang');    

// 在Session上写入一个值 
session.setAttribute('name', 'zhang');    

// 在Session上移除一个值 
session.removeAttribute('name');          

// 清空此Session的所有值 
session.clearAttribute();                 

// 获取此Session是否含有指定key (返回true或false)
session.containsAttribute('name');        

// 获取此Session会话上所有key (返回Set<String>)
session.attributeKeys();                  

// 返回此Session会话上的底层数据对象如果更新map里的值请调用session.update()方法避免产生脏数据)
session.getDataMap();                     

// 将这个Session从持久库更新一下
session.update();                         

// 注销此Session会话 (从持久库删除此Session)
session.logout();                         

类型转换API

由于Session存取值默认的类型都是Object因此我们通常会写很多不必要类型转换代码
为了简化操作sa-token自v1.15.0封装了存取值API的类型转换你可以非常方便的调用以下方法

// 写值 
session.set("name", "zhang"); 

// 写值(只有在此key原本无值的时候才会写入)
session.set("name", "zhang");

// 取值
session.get("name");

// 取值 (指定默认值)
session.get("name", "<defaultValue>"); 

// 取值 (转String类型)
session.getString("name"); 

// 取值 (转int类型)
session.getInt("age"); 

// 取值 (转long类型)
session.getLong("age"); 

// 取值 (转double类型)
session.getDouble("result"); 

// 取值 (转float类型)
session.getFloat("result"); 

// 取值 (指定转换类型)
session.getModel("key", Student.class); 

// 取值 (指定转换类型, 并指定值为Null时返回的默认值)
session.getModel("key", Student.class, <defaultValue>); 

// 是否含有某个key
session.has("key"); 

Session环境隔离说明

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

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

要点:

  1. SaSessionHttpSession 没有任何关系,在HttpSession上写入的值,在SaSession中无法取出
  2. HttpSession并未被框架接管在使用sa-token时请在任何情况下均使用SaSession,不要使用HttpSession