1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官問:說說單點登錄的三種實現(xiàn)方式

        共 4366字,需瀏覽 9分鐘

         ·

        2021-09-01 19:24

        點擊上方藍色字體,選擇“標星公眾號”

        優(yōu)質(zhì)文章,第一時間送達

        前言

        在 B/S 系統(tǒng)中,登錄功能通常都是基于 Cookie 來實現(xiàn)的。當用戶登錄成功后,一般會將登錄狀態(tài)記錄到 Session 中,或者是給用戶簽發(fā)一個 Token,無論哪一種方式,都需要在客戶端保存一些信息(Session ID 或 Token ),并要求客戶端在之后的每次請求中攜帶它們。在這樣的場景下,使用 Cookie 無疑是最方便的,因此我們一般都會將 Session 的 ID 或 Token 保存到 Cookie 中,當服務端收到請求后,通過驗證 Cookie 中的信息來判斷用戶是否登錄 。

        單點登錄(Single Sign On, SSO)是指在同一帳號平臺下的多個應用系統(tǒng)中,用戶只需登錄一次,即可訪問所有相互信任的應用系統(tǒng)。舉例來說,百度貼吧和百度地圖是百度公司旗下的兩個不同的應用系統(tǒng),如果用戶在百度貼吧登錄過之后,當他訪問百度地圖時無需再次登錄,那么就說明百度貼吧和百度地圖之間實現(xiàn)了單點登錄。

        單點登錄的本質(zhì)就是在多個應用系統(tǒng)中共享登錄狀態(tài)。如果用戶的登錄狀態(tài)是記錄在 Session 中的,要實現(xiàn)共享登錄狀態(tài),就要先共享 Session,比如可以將 Session 序列化到 Redis 中,讓多個應用系統(tǒng)共享同一個 Redis,直接讀取 Redis 來獲取 Session。當然僅此是不夠的,因為不同的應用系統(tǒng)有著不同的域名,盡管 Session 共享了,但是由于 Session ID 是往往保存在瀏覽器 Cookie 中的,因此存在作用域的限制,無法跨域名傳遞,也就是說當用戶在 app1.com 中登錄后,Session ID 僅在瀏覽器訪問 app1.com 時才會自動在請求頭中攜帶,而當瀏覽器訪問 app2.com 時,Session ID 是不會被帶過去的。實現(xiàn)單點登錄的關鍵在于,如何讓 Session ID(或 Token)在多個域中共享。

        實現(xiàn)方式一:父域 Cookie

        在將具體實現(xiàn)之前,我們先來聊一聊 Cookie 的作用域。

        Cookie 的作用域由 domain 屬性和 path 屬性共同決定。domain 屬性的有效值為當前域或其父域的域名/IP地址,在 Tomcat 中,domain 屬性默認為當前域的域名/IP地址。path 屬性的有效值是以“/”開頭的路徑,在 Tomcat 中,path 屬性默認為當前 Web 應用的上下文路徑。

        如果將 Cookie 的 domain 屬性設置為當前域的父域,那么就認為它是父域 Cookie。Cookie 有一個特點,即父域中的 Cookie 被子域所共享,換言之,子域會自動繼承父域中的Cookie。

        利用 Cookie 的這個特點,不難想到,將 Session ID(或 Token)保存到父域中不就行了。沒錯,我們只需要將 Cookie 的 domain 屬性設置為父域的域名(主域名),同時將 Cookie 的 path 屬性設置為根路徑,這樣所有的子域應用就都可以訪問到這個 Cookie 了。不過這要求應用系統(tǒng)的域名需建立在一個共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它們都建立在 baidu.com 這個主域名之下,那么它們就可以通過這種方式來實現(xiàn)單點登錄。

        總結(jié):此種實現(xiàn)方式比較簡單,但不支持跨主域名。

        實現(xiàn)方式二:認證中心

        我們可以部署一個認證中心,認證中心就是一個專門負責處理登錄請求的獨立的 Web 服務。

        用戶統(tǒng)一在認證中心進行登錄,登錄成功后,認證中心記錄用戶的登錄狀態(tài),并將 Token 寫入 Cookie。(注意這個 Cookie 是認證中心的,應用系統(tǒng)是訪問不到的。)

        應用系統(tǒng)檢查當前請求有沒有 Token,如果沒有,說明用戶在當前系統(tǒng)中尚未登錄,那么就將頁面跳轉(zhuǎn)至認證中心。由于這個操作會將認證中心的 Cookie 自動帶過去,因此,認證中心能夠根據(jù) Cookie 知道用戶是否已經(jīng)登錄過了。如果認證中心發(fā)現(xiàn)用戶尚未登錄,則返回登錄頁面,等待用戶登錄,如果發(fā)現(xiàn)用戶已經(jīng)登錄過了,就不會讓用戶再次登錄了,而是會跳轉(zhuǎn)回目標 URL ,并在跳轉(zhuǎn)前生成一個 Token,拼接在目標 URL 的后面,回傳給目標應用系統(tǒng)。

        應用系統(tǒng)拿到 Token 之后,還需要向認證中心確認下 Token 的合法性,防止用戶偽造。確認無誤后,應用系統(tǒng)記錄用戶的登錄狀態(tài),并將 Token 寫入 Cookie,然后給本次訪問放行。(注意這個 Cookie 是當前應用系統(tǒng)的,其他應用系統(tǒng)是訪問不到的。)當用戶再次訪問當前應用系統(tǒng)時,就會自動帶上這個 Token,應用系統(tǒng)驗證 Token 發(fā)現(xiàn)用戶已登錄,于是就不會有認證中心什么事了。

        這里順便介紹兩款認證中心的開源實現(xiàn):

        • Apereo CAS 是一個企業(yè)級單點登錄系統(tǒng),其中 CAS 的意思是”Central Authentication Service“。它最初是耶魯大學實驗室的項目,后來轉(zhuǎn)讓給了 JASIG 組織,項目更名為 JASIG CAS,后來該組織并入了Apereo 基金會,項目也隨之更名為 Apereo CAS。
        • XXL-SSO 是一個簡易的單點登錄系統(tǒng),由大眾點評工程師許雪里個人開發(fā),代碼比較簡單,沒有做安全控制,因而不推薦直接應用在項目中,這里列出來僅供參考。

        總結(jié):此種實現(xiàn)方式相對復雜,支持跨域,擴展性好,是單點登錄的標準做法。

        實現(xiàn)方式三:LocalStorage 跨域

        前面,我們說實現(xiàn)單點登錄的關鍵在于,如何讓 Session ID(或 Token)在多個域中共享。

        父域 Cookie 確實是一種不錯的解決方案,但是不支持跨域。那么有沒有什么奇淫技巧能夠讓 Cookie 跨域傳遞呢?

        很遺憾,瀏覽器對 Cookie 的跨域限制越來越嚴格。Chrome 瀏覽器還給 Cookie 新增了一個 SameSite 屬性,此舉幾乎禁止了一切跨域請求的 Cookie 傳遞(超鏈接除外),并且只有當使用 HTTPs 協(xié)議時,才有可能被允許在 AJAX 跨域請求中接受服務器傳來的 Cookie。

        不過,在前后端分離的情況下,完全可以不使用 Cookie,我們可以選擇將 Session ID (或 Token )保存到瀏覽器的 LocalStorage 中,讓前端在每次向后端發(fā)送請求時,主動將 LocalStorage 的數(shù)據(jù)傳遞給服務端。這些都是由前端來控制的,后端需要做的僅僅是在用戶登錄成功后,將 Session ID (或 Token )放在響應體中傳遞給前端。

        在這樣的場景下,單點登錄完全可以在前端實現(xiàn)。前端拿到 Session ID (或 Token )后,除了將它寫入自己的 LocalStorage 中之外,還可以通過特殊手段將它寫入多個其他域下的 LocalStorage 中。

        關鍵代碼如下:

        // 獲取 token
        var token = result.data.token;

        // 動態(tài)創(chuàng)建一個不可見的iframe,在iframe中加載一個跨域HTML
        var iframe = document.createElement("iframe");
        iframe.src = "http://app1.com/localstorage.html";
        document.body.append(iframe);
        // 使用postMessage()方法將token傳遞給iframe
        setTimeout(function () {
            iframe.contentWindow.postMessage(token, "http://app1.com");
        }, 4000);
        setTimeout(function () {
            iframe.remove();
        }, 6000);

        // 在這個iframe所加載的HTML中綁定一個事件監(jiān)聽器,當事件被觸發(fā)時,把接收到的token數(shù)據(jù)寫入localStorage
        window.addEventListener('message'function (event) {
            localStorage.setItem('token', event.data)
        }, false);

        前端通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個域下的 LocalStorage 中,前端每次在向后端發(fā)送請求之前,都會主動從 LocalStorage 中讀取 Token 并在請求中攜帶,這樣就實現(xiàn)了同一份 Token 被多個域所共享。

        總結(jié):此種實現(xiàn)方式完全由前端控制,幾乎不需要后端參與,同樣支持跨域。

        補充:域名分級

        從專業(yè)的角度來說(根據(jù)《計算機網(wǎng)絡》中的定義),.com、.cn 為一級域名(也稱頂級域名),.com.cn、baidu.com 為二級域名,sina.com.cn、tieba.baidu.com 為三級域名,以此類推,N 級域名就是 N-1 級域名的直接子域名。

        從使用者的角度來說,一般把可支持獨立備案的主域名稱作一級域名,如 baidu.com、sina.com.cn 皆可稱作一級域名,在主域名下建立的直接子域名稱作二級域名,如 tieba.baidu.com 為二級域名。

        為了避免歧義,本人將使用“主域名“替代”一級域名“的說法。



          作者 |  張永恒

        來源 |  cnblogs.com/yonghengzh/p/13712729.html



        加鋒哥微信: java3459  
        圍觀鋒哥朋友圈,天天推送Java干貨!

        瀏覽 77
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            热九九热| 一级婬片A片AAAA毛片A级 | 日本爽妇网| 人人射人人爱| 黄色福利视频在线观看| 亚洲欧洲精品成人久久曰影片| 91熊猫视频| 五月婷婷中文字幕| 日韩美女视频19| 老鸭窝在线观看视频| 午夜成人鲁丝片午夜精品| 精品视频在线观看免费| 成年人视频免费| av一区在线| 思思热这里只有精品| 国产欧美一区二区人妻喷水| 怡红院成人网| 91综合视频| 国产精品自拍小视频| 天堂网2014| 欧美深夜福利| 激情无码一区二区三区| 午夜偷拍视频| www.有码99| 欧美黄片在线免费看| 久久激情国产| 欧美日韩狠狠操在线观看视频| 在线免费看黄片| 爱爱一区| 亚洲色欲色欲www在线成人网| 国产精品1区2区| 国产多人搡BBBB槡BBBB | 97超碰自拍| 91一区二区在线播放精品| 日韩A片免费| 亚洲小视频| 亚洲AV无码国产精品| 99综合网| 在线观看欧美日韩| 日韩久久电影| 特级西西人体WWWWW| 国产精品成人免费视频| 国产又粗又黄| 色欲成人网| 91就去干| 蜜臀久久99精品久久久久久宅男| 亚洲日韩毛片| 特特级毛片| 91丨九色丨蝌蚪丨肥女| 脓肿是什么原因引起的,该怎么治疗| 91香蕉视频18| 自拍超碰| 黄网在线看| 日韩一级欧美一级| 91网站在线看| 三级片91| 在线午夜福利| 久草青青草| 一区二区三区网| 亚洲欧美激情小说| 99毛片| 嫰BBB槡BBBB槡BBBB| 高清无码三级片在线观看| 丰满人妻一区二区三区免费| 亚洲AV无码专区在线播放中文| 色悠悠国产| 免费黄色片子| 国产免费一级特黄A片| 永久在线| 亚洲人免费视频| 国产精品毛片一区二区在线看| 国产精品999999| 日韩不卡av| 欧美二区视频| 国产精品中文字幕在线观看| 99热在线观看者| 日韩第三页| 淫色AV| 1024大香蕉| 欧美日韩人妻高清中文| 99re视频在线播放| 人人操人人看人人| 日韩不卡视频在线观看| 久久久久久久久免费视频| 亚洲经典一| 闺蜜AV| 91破处网站| 国产无遮挡又黄又爽又色视频软件| 中文字幕北条麻妃| 色噜噜狠狠一区二区三区| av无码免费在线观看| 亚洲欧美日韩成人| 91成人视频免费观看| 97色色网站| 欧美亚洲精品在线| 亚洲第一黄色视频| 啊啊啊啊啊在线观看| 天天天天日天天干| 摸BBB搡BBB搡BBBB| 熟妇槡BBBB槡BBBB图| 婷婷国产精品视频| 一区在线免费观看| 久久久精品午夜人成欧洲亚洲韩国| 中文字幕亚洲欧美| 欧美日韩国产成人在线| 91人人看| 人妻碰碰| 刘玥91精一区二区三区| 男女操网站| 国产黄色网页| 国产无码毛片| 日本无码一区二区| 国产高清自拍| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 五月婷婷丁香| 99久久国内精品成人免费| 国产精品18进进出出17c| 人人操干| 苍井空中文字幕在线观看| 国产日韩在线播放| 先锋资源日韩| 一区二区三区无码精品| 亚洲人成电影网| 怡春院欧美| 国产精品成人无码专区| 91视频专区| 五月天婷婷基地| 亲子乱一区二区三区视频| 一区在线播放| 亚洲色情视频| 丹麦电影《下午》| 91蜜桃传媒| 最美人妖系列国产Ts涵涵| 大香蕉中文视频| 国产中文字幕免费| 一本无码高清| 国产精品秘久久久久久1-~/\v7-/ 囯产精品一区二区三区线一牛影视1 | 麻豆视频免费观看| 欧美日韩色| 亚洲激情四射| 日韩精品视频在线免费观看| 欧美精品秘一区二区三区蜜臀| 国产高清视频在线| 亚洲第一网无码性色| 日韩成人黄色视频| 99精品一区二区三区| 亚洲精品久久久久久久蜜桃| 蜜臀AV午夜精品| 欧美日韩高清一区二区三区| 91免费在线看| 欧美国产精品一二三产品在哪买| 欧美精产国品一二三区| 日韩一级一片内射视频4K| 亚洲精品鲁一鲁一区二区三区| 欧美成人综合一区| 成人日韩在线| 北条麻妃av在线播放| 波多野在线视频| 黄片视频免费在线观看| 999日本不卡影院| 国产成人视频在线播放| 日韩欧美91| 黄色片a片| 俺也去AV| 成人91看片| 777AV| 做爱网站在线观看| 高圆圆一区二区三区| 青青草伊人大香蕉| 无码一区二区三区四区五区六区| 日日爱爱| 欧美性爱视频网站| 欧美精品毛片| 天天色天天撸| 欧美国产综合| 国产精品93333333| 国产精品性爱| 国产成人精品八戒| 日韩国产综合| 69成人在线电影| 俺也去大香蕉| 青青草精品视频| 不卡一区| 苍井空中文字幕在线观看| 亚洲综合人妻| 伊人久久香| 白嫩外女BBWBBWBBW| 国产成人久久| 大香蕉第一页| 狼友视频免费在线观看| 精品无码一区二区三区的天堂| 欧美午夜视频| www.四虎成人网站| 亚洲精品一线| 亚洲天天在线| 黄片小视频在线观看| 色哟哟一区二区三区| 先锋影音资源站| 国产精品欧美性爱| 91大神shunv| 日韩小黄片| 91人妻无码精品一区二区毛片| 91在线无码精品国产三年| 成年人激情网| 午夜69成人做爱视频网站| 黄色小视频免费观看| 国产AV激情| 麻豆视屏| 国产一级AV免费观看| 99久久99久久| 亚洲精品久久久久久| 三级无码AV| 艹逼片| 好男人WWW一区二区三区| 国产一区二区AV| 奶大丰满一乱一视频一区二区三区在| 大鸡巴伊人| 成人黄色免费看| 17c.白丝喷水自慰| 天堂无线av无码av| 国产成人自拍视频在线| 国产A级片| 久草热在线| 色色一区| 色婷婷中文在线| 国产三级在线免费观看| 国产精品午夜成人免费| 99热在线观看| 无码人妻丰满熟妇区17水蜜桃| 日韩逼| 国产一卡二卡三卡| gogogo视频在线观看黑人| 狠狠色狠狠撸| 日韩乱伦av| 成人在线视频网| 婷婷激情中文字幕| 日本一区二区在线视频| 无码三| 亚洲一区av| 级婬片AAAAAAA免费| 亚洲AV成人网| 正在播放国产精品| 加勒比无码人妻| 人妻人操| 日韩在线中文字幕视频| 黄色片免费| 亚洲中文字幕无码爆乳av| 一本无码高清| 激情性爱五月天| 免费的黄色录像| 男人的天堂网页| 大香蕉久热| 人人操人人爽| 黄色片AA| 亚洲小说欧美激情另类A片小说| 青草免费视频| 婷婷视频导航| 日本欧美在线视频| 欧洲一区二区| 国产在线观看自拍| 欧美成人福利在线观看| 国产肏逼视频| 青青五月天| 日本免费黄色小视频| 国产一区二区三区视频在线观看| 三级久久| 少妇喷水在线观看| 欧美日韩国内| 婷婷五月天在线观看| 亚洲一在线| www男人天堂| 大香蕉伊人在线视频| 国产黄色一级电影| 一道本一区二区三区| 欧美中文字幕在线| 欧美黄网站在线观看| 97人妻天天摸天天爽天天| 亚洲精品视频在线| 国产又粗又大又爽| 日韩欧美精品一区二区| 97超碰人人| 99热99re6国产线播放| 四川婬妇BBw搡BBBB搡| 欧美成人毛片AAAAAA| 国产一区二区波多野结衣| 日韩a级毛片| 国产视频久久| 久久综合无码内射国产| 黄色AV免费| 懂色成人Av| 国产91久久婷婷一区二区| 人人干人人干人人| 天天色网站| 最新中文字幕av| 久久逼逼| 97精品无码| A视频免费观看| 欧美性受XXXX黑人XYX性爽| 操极品少妇逼| 91爱爱网|