Sa-Token中的SaSession對(duì)象使用學(xué)習(xí)示例詳解
引言
Sa-Token 是一個(gè)輕量級(jí) java 權(quán)限認(rèn)證框架,主要解決登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題。
Gitee 開源地址:https://gitee.com/dromara/sa-token
本文將詳細(xì)介紹 Sa-Token 中的不同 SaSession 對(duì)象的區(qū)別,以及各種方便的存取值的方法。
一、Session 是什么?
Session 是會(huì)話中專業(yè)的數(shù)據(jù)緩存組件,通過 Session 我們可以很方便的緩存一些高頻讀寫數(shù)據(jù),提高程序性能,例如:
// 在登錄時(shí)緩存user對(duì)象 StpUtil.getSession().set("user", user); // 然后我們就可以在任意處使用這個(gè)user對(duì)象 SysUser user = (SysUser) StpUtil.getSession().get("user");
在 Sa-Token 中,SaSession 分為三種,分別是:
User-Session
: 指的是框架為每個(gè) 賬號(hào)id 分配的 SaSession。Token-Session
: 指的是框架為每個(gè) token 分配的 SaSession。Custom-Session
: 指的是以一個(gè) 特定的值 作為SessionId,來分配的 Session。
假設(shè)三個(gè)客戶端登錄同一賬號(hào),且配置了不共享token,那么此時(shí)的Session模型是:
簡(jiǎn)而言之:
User-Session
以UserId為主,只要token指向的UserId一致,那么對(duì)應(yīng)的Session對(duì)象就一致。Token-Session
以token為主,只要token不同,那么對(duì)應(yīng)的Session對(duì)象就不同。Custom-Session
以特定的key為主,不同key對(duì)應(yīng)不同的Session對(duì)象,同樣的key指向同一個(gè)Session對(duì)象。
二、獲取 User-Session
有關(guān)賬號(hào)Session的API如下:
// 獲取當(dāng)前賬號(hào)id的Session (必須是登錄后才能調(diào)用) StpUtil.getSession(); // 獲取當(dāng)前賬號(hào)id的Session, 并決定在Session尚未創(chuàng)建時(shí),是否新建并返回 StpUtil.getSession(true); // 獲取賬號(hào)id為10001的Session StpUtil.getSessionByLoginId(10001); // 獲取賬號(hào)id為10001的Session, 并決定在Session尚未創(chuàng)建時(shí),是否新建并返回 StpUtil.getSessionByLoginId(10001, true); // 獲取SessionId為xxxx-xxxx的Session, 在Session尚未創(chuàng)建時(shí), 返回null StpUtil.getSessionBySessionId("xxxx-xxxx");
三、獲取 Token-Session
有關(guān)令牌Session的API如下:
// 獲取當(dāng)前 Token 的 Token-Session 對(duì)象 StpUtil.getTokenSession(); // 獲取指定 Token 的 Token-Session 對(duì)象 StpUtil.getTokenSessionByToken(token);
四、獲取自定義Session
自定義Session指的是以一個(gè)特定的值
作為SessionId來分配的Session
, 借助自定義Session,你可以為系統(tǒng)中的任意元素分配相應(yīng)的session
例如以商品id作為key為每個(gè)商品分配一個(gè)Session,以便于緩存和商品相關(guān)的數(shù)據(jù),其相關(guān)API如下:
// 查詢指定key的Session是否存在 SaSessionCustomUtil.isExists("goods-10001"); // 獲取指定key的Session,如果沒有,則新建并返回 SaSessionCustomUtil.getSessionById("goods-10001"); // 獲取指定key的Session,如果沒有,第二個(gè)參數(shù)決定是否新建并返回 SaSessionCustomUtil.getSessionById("goods-10001", false); // 刪除指定key的Session SaSessionCustomUtil.deleteSessionById("goods-10001");
五、在 Session 上存取值
// 寫值 session.set("name", "zhang"); // 寫值 (只有在此key原本無值的時(shí)候才會(huì)寫入) session.setDefaultValue("name", "zhang"); // 取值 session.get("name"); // 取值 (指定默認(rèn)值) session.get("name", "<defaultValue>"); // 取值 (若無值則執(zhí)行參數(shù)方法, 之后將結(jié)果保存到此鍵名下,并返回此結(jié)果 若有值則直接返回, 無需執(zhí)行參數(shù)方法) session.get("name", () -> { return ...; }); // ---------- 數(shù)據(jù)類型轉(zhuǎn)換: ---------- session.getInt("age"); // 取值 (轉(zhuǎn)int類型) session.getLong("age"); // 取值 (轉(zhuǎn)long類型) session.getString("name"); // 取值 (轉(zhuǎn)String類型) session.getDouble("result"); // 取值 (轉(zhuǎn)double類型) session.getFloat("result"); // 取值 (轉(zhuǎn)float類型) session.getModel("key", Student.class); // 取值 (指定轉(zhuǎn)換類型) session.getModel("key", Student.class, <defaultValue>); // 取值 (指定轉(zhuǎn)換類型, 并指定值為Null時(shí)返回的默認(rèn)值) // 是否含有某個(gè)key (返回true或false) session.has("key"); // 刪值 session.delete('name'); // 清空所有值 session.clear(); // 獲取此 Session 的所有key (返回Set<String>) session.keys();
六、其它操作
// 返回此 Session 的id session.getId(); // 返回此 Session 的創(chuàng)建時(shí)間 (時(shí)間戳) session.getCreateTime(); // 返回此 Session 會(huì)話上的底層數(shù)據(jù)對(duì)象(如果更新map里的值,請(qǐng)調(diào)用session.update()方法避免產(chǎn)生臟數(shù)據(jù)) session.getDataMap(); // 將這個(gè) Session 從持久庫更新一下 session.update(); // 注銷此 Session 會(huì)話 (從持久庫刪除此Session) session.logout();
七、SaSession 環(huán)境隔離說明
有同學(xué)經(jīng)常會(huì)把 SaSession
與 HttpSession
進(jìn)行混淆,例如:
@PostMapping("/resetPoints") public void reset(HttpSession session) { // 在 HttpSession 上寫入一個(gè)值 session.setAttribute("name", 66); // 在 SaSession 進(jìn)行取值 System.out.println(StpUtil.getSession().get("name")); // 輸出null }
要點(diǎn):
SaSession
與HttpSession
沒有任何關(guān)系,在HttpSession
上寫入的值,在SaSession
中無法取出。HttpSession
并未被框架接管,在使用Sa-Token時(shí),請(qǐng)?jiān)谌魏吻闆r下均使用SaSession
,不要使用HttpSession
。
八、未登錄場(chǎng)景下獲取 Token-Session
默認(rèn)場(chǎng)景下,只有登錄后才能通過 StpUtil.getTokenSession()
獲取 Token-Session
。
如果想要在未登錄場(chǎng)景下獲取 Token-Session ,有兩種方法:
- 方法一:將全局配置項(xiàng)
tokenSessionCheckLogin
改為 false。 - 方法二:使用匿名 Token-Session
// 獲取當(dāng)前 Token 的匿名 Token-Session (可在未登錄情況下使用的 Token-Session) StpUtil.getAnonTokenSession();
注意點(diǎn):如果前端沒有提交 Token ,或者提交的 Token 是一個(gè)無效 Token 的話,框架將不會(huì)根據(jù)此 Token 創(chuàng)建 Token-Session
對(duì)象,而是隨機(jī)一個(gè)新的 Token 值來創(chuàng)建 Token-Session
對(duì)象,此 Token 值可以通過 StpUtil.getTokenValue()
獲取到。
參考資料
- Sa-Token 文檔:https://sa-token.cc
- Gitee 倉庫地址:https://gitee.com/dromara/sa-token
- GitHub 倉庫地址:https://github.com/dromara/sa-token
以上就是Sa-Token中的SaSession對(duì)象使用學(xué)習(xí)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Sa-Token SaSession對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java并發(fā)等待條件的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了java并發(fā)等待條件的實(shí)現(xiàn)原理詳解,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11Maven多模塊及version修改的實(shí)現(xiàn)方法
這篇文章主要介紹了Maven多模塊及version修改的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性
這篇文章主要介紹了使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08springboot配置Jackson返回統(tǒng)一默認(rèn)值的實(shí)現(xiàn)示例
在項(xiàng)目開發(fā)中,我們返回的數(shù)據(jù)或者對(duì)象沒有的時(shí)候一般直接返回的null,那么如何返回統(tǒng)一默認(rèn)值,感興趣的可以了解一下2021-07-07mybaits-plus?lambdaQuery()?和?lambdaUpdate()?常見的使用方法
MyBatis-Plus是一個(gè)?MyBatis?(opens?new?window)的增強(qiáng)工具,在?MyBatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,這篇文章主要介紹了mybaits-plus?lambdaQuery()?和?lambdaUpdate()?比較常見的使用方法,需要的朋友可以參考下2023-01-01SpringBoot使用WebJars統(tǒng)一管理靜態(tài)資源的方法
這篇文章主要介紹了SpringBoot使用WebJars統(tǒng)一管理靜態(tài)資源的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12JUC三大輔助類CountDownLatch、CyclicBarrier和Semaphore詳解
這篇文章主要介紹了JUC三大輔助類CountDownLatch、CyclicBarrier和Semaphore詳解,CountDownLatch 類可以設(shè)置一個(gè)計(jì)數(shù)器,然后通過 countDown 方法來進(jìn)行 減 1 的操作,使用 await 方法等待計(jì)數(shù)器不大于 0,然后繼續(xù)執(zhí)行 await 方法 之后的語句,需要的朋友可以參考下2024-01-01