日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shiro框架---关于多项目之间验证为什么需要共享session

發(fā)布時(shí)間:2025/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shiro框架---关于多项目之间验证为什么需要共享session 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)于多項(xiàng)目之間登錄驗(yàn)證為什么需要共享session

服務(wù)器上部署了兩個(gè)項(xiàng)目,登錄之后才可以訪問(wèn)其中的接口。現(xiàn)在想要實(shí)現(xiàn),當(dāng)?shù)卿涰?xiàng)目1成功后,可以不需要再登錄項(xiàng)目2,直接可以訪問(wèn)項(xiàng)目2中的接口。
大部分人都會(huì)想到,共享session ,但是為什么是共享session 呢?

一、為什么需要共享session

以shiro 框架作為登錄驗(yàn)證權(quán)限框架 為例,這里還不寫(xiě)這個(gè),先說(shuō)為什么需要共享session ,正常情況的時(shí)候,是如下圖:

如上圖描述,每個(gè)項(xiàng)目中shiro 都維護(hù)了自己的sessionid與session的關(guān)系 ,它們之間不共享。

上圖兩個(gè)項(xiàng)目中切換請(qǐng)求必然會(huì)有如下的步驟:
1、sessionId串的生成

瀏覽器首次對(duì)項(xiàng)目1發(fā)起請(qǐng)求時(shí),項(xiàng)目1 會(huì)為當(dāng)前請(qǐng)求創(chuàng)建一個(gè)session ,根據(jù)session 生成一個(gè)sessionId 字符串,該sessionId串 與創(chuàng)建的session 維護(hù)著一個(gè)關(guān)聯(lián)關(guān)系。

2、sessionId串存到cookie中

后臺(tái)將該sessionId串返回給瀏覽器,瀏覽器將sessionId串 拿到后,存儲(chǔ)到瀏覽器中的cookie 中。如下圖:

3、再去請(qǐng)求項(xiàng)目2

當(dāng)然,當(dāng)前的這個(gè)sessionId串 僅僅對(duì)項(xiàng)目1 來(lái)說(shuō)是認(rèn)識(shí)的。如果這時(shí)候?yàn)g覽器接著訪問(wèn)項(xiàng)目2,(在http請(qǐng)求中,發(fā)起請(qǐng)求的一方總會(huì)把自身所帶的所有cookie 打包到請(qǐng)求頭中傳給服務(wù))。如下邊兩張圖所示:

第一張為在去請(qǐng)求項(xiàng)目2前,可以看到瀏覽器中的cookie ,此時(shí)共有三個(gè),其中sessionId 對(duì)應(yīng)的字符串是來(lái)自于項(xiàng)目1 登錄成功后返回的 :

當(dāng)我對(duì)項(xiàng)目2 發(fā)起請(qǐng)求,瀏覽器將現(xiàn)有的所有cookie 串統(tǒng)統(tǒng)放到了request headers 里,傳了過(guò)去。

4、請(qǐng)求必然失敗

這時(shí)候項(xiàng)目2 中已有的session 集合中無(wú)法根據(jù)當(dāng)前傳入進(jìn)來(lái)的sessionId串 匹配成功的。因此登錄不成功。
問(wèn)題就看出來(lái),是因?yàn)轫?xiàng)目2 里的session 集合無(wú)法認(rèn)識(shí)當(dāng)前傳入進(jìn)來(lái)的sessionId ,匹配不到session 導(dǎo)致的訪問(wèn)失敗。

二、共享session 后的邏輯

上邊已大致說(shuō)明為什么需要共享session 。那共享session 后,是什么邏輯,也備了一張圖,下邊的共享項(xiàng)目我已經(jīng)共享到GitHub 中了。
先來(lái)說(shuō)一下我的理解 ,如下:


上圖中master 項(xiàng)目為主項(xiàng)目,登錄頁(yè)即在這個(gè)項(xiàng)目中,suiteone 、suitetwo 為兩個(gè)從項(xiàng)目,當(dāng)兩個(gè)從項(xiàng)目有請(qǐng)求時(shí),如果沒(méi)有登錄的時(shí)候,都會(huì)打到master 項(xiàng)目的登錄頁(yè)上。共享session 采用的是redis 存儲(chǔ)。

上圖的步驟如下:

  • 瀏覽器請(qǐng)求master 項(xiàng)目,第一次請(qǐng)求的時(shí)候,也是會(huì)帶著瀏覽器中的cookie 去請(qǐng)求,當(dāng)然第一次去redis 里肯定找不到對(duì)應(yīng)的session,會(huì)通過(guò)⑤進(jìn)入到登錄頁(yè)。
  • 當(dāng)在登錄頁(yè)輸入完正確的賬號(hào)密碼后,才能登錄成功,否則仍會(huì)回到⑤。
  • 在這一步的時(shí)候,會(huì)將登錄成功后的session ,根據(jù)它,將生成sessionId串 ,并傳到前端瀏覽器中,瀏覽器以cookie 存儲(chǔ)。
  • 同時(shí)將第③步中生成的session 存儲(chǔ)到redis 中。
  • 當(dāng)前這里,不只是當(dāng)?shù)卿浭〉臅r(shí)候,會(huì)進(jìn)入到登錄頁(yè)中,當(dāng)瀏覽器長(zhǎng)時(shí)間沒(méi)有訪問(wèn)后臺(tái)(每次瀏覽器訪問(wèn)后臺(tái),其實(shí)都會(huì)刷新session 的過(guò)期時(shí)間expireTime),導(dǎo)致session 超過(guò)時(shí),也會(huì)進(jìn)入到該步中。
  • 當(dāng)瀏覽器請(qǐng)求suiteone 、suteTwo 這兩個(gè)從項(xiàng)目時(shí),肯定也是將當(dāng)前瀏覽器中的所有的cookie 設(shè)置到request headers 請(qǐng)求頭中。
  • 根據(jù)傳入的sessionId串 到共享的redis 存儲(chǔ)中匹配。
  • 如果匹配不到,則會(huì)跳轉(zhuǎn)到master 項(xiàng)目的登錄頁(yè),如果匹配成功,則會(huì)訪問(wèn)通過(guò)。
  • 以上描述的并不難,大家也都會(huì)想到,那么如何將扯了這么多的淡 真正更簡(jiǎn)單的,落地實(shí)現(xiàn)才是大家關(guān)注的。
    如果想了解具體shiro中如何實(shí)現(xiàn)的共享session ,可以參考下邊的鏈接
    [shiro框架—多項(xiàng)目登錄訪問(wèn)共享session的實(shí)現(xiàn)]

    總結(jié)

    以上是生活随笔為你收集整理的shiro框架---关于多项目之间验证为什么需要共享session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。