成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

單點登錄三種方式,夠狠!夠勁爆!

網絡 通信技術
單點登錄分為三種機制,這三種機制分別為http無狀態協議,會話機制,登錄機制等這三種機制。

 [[374892]]

本文轉載自微信公眾號「小明菜市場」,作者小明菜市場 。轉載本文請聯系小明菜市場公眾號。

前言

單點登錄分為三種機制,這三種機制分別為http無狀態協議,會話機制,登錄機制等這三種機制。

http無狀態協議

web應用采用browser/server架構,http作為通信協議,http是無狀態協議,瀏覽器的每一次請求,服務器都會獨立處理,用如下圖進行說明,三次請求和響應之間沒有任何關系。即,根據上圖可以看到,http的請求是無狀態的協議。

會話機制

瀏覽器第一次訪問請求服務器的時候,服務器再次創建一個會話,并把數據發送給瀏覽器,瀏覽器保存會話id,服務器從請求中通過id判斷是不是一個用戶。

服務器在內存中保存會話對象,瀏覽器怎么保存會話id呢?你可能會想到兩種方式

  1. 請求參數
  2. cookie   將會話id作為每一個請求的參數,服務器接收請求自然能解析參數獲得會話id,并借此判斷是否來自同一會話,很明顯,這種方式不靠譜。那就瀏覽器自己來維護這個會話id吧,每次發送http請求時瀏覽器自動發送會話id,cookie機制正好用來做這件事。cookie是瀏覽器用來存儲少量數據的一種機制,數據以”key/value“形式存儲,瀏覽器發送http請求時自動附帶cookie信息

tomcat會話機制當然也實現了cookie,訪問tomcat服務器時,瀏覽器中可以看到一個名為“JSESSIONID”的cookie,這就是tomcat會話機制維護的會話id,使用了cookie的請求響應過程如下圖

登錄狀態

有了會話機制,登錄狀態就是假設瀏覽器第一次請求服務器需要輸入用戶名和密碼驗證身份,服務器拿到持有這個會話的用戶就是合法用戶,應該吧這個會話標記為已授權或者已登錄。標識如下所示;

  1. HttpSession session = request.getSession(); 
  2. session.setAttribute("isLogin"true); 

用戶再次訪問,會查看到如下的登錄狀態

  1. HttpSession session = request.getSession(); 
  2. session.getAttribute("isLogin"); 

實現的模型如下所示:

每次請求受保護資源時都會檢查會話對象中的登錄狀態,只有 isLogin=true 的會話才能訪問,登錄機制因此而實現。

下面開始闡述實現方式

實現方式之一:父域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 了。不過這要求應用系統的域名需建立在一個共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它們都建立在 baidu.com 這個主域名之下,那么它們就可以通過這種方式來實現單點登錄。

實現方式之二:認證中心

我們可以部署一個認證中心,專門處理這些問題 用戶統一在認證中心進行登錄,登錄成功后,認證中心記錄用戶的登錄狀態,并將 Token 寫入 Cookie。應用系統檢查當前請求有沒有 Token,如果沒有,說明用戶在當前系統中尚未登錄,那么就將頁面跳轉至認證中心。由于這個操作會將認證中心的 Cookie 自動帶過去,因此,認證中心能夠根據 Cookie 知道用戶是否已經登錄過了。如果認證中心發現用戶尚未登錄,則返回登錄頁面,等待用戶登錄,如果發現用戶已經登錄過了,就不會讓用戶再次登錄了,而是會跳轉回目標 URL ,并在跳轉前生成一個 Token,拼接在目標 URL 的后面,回傳給目標應用系統。

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

LocalStorage跨域實現

如何讓 Session ID(或 Token)在多個域中共享。父域 Cookie 確實是一種不錯的解決方案,但是不支持跨域。那么有沒有什么奇淫技巧能夠讓 Cookie 跨域傳遞呢?很遺憾,瀏覽器對 Cookie 的跨域限制越來越嚴格。Chrome 瀏覽器還給 Cookie 新增了一個 SameSite 屬性,此舉幾乎禁止了一切跨域請求的 Cookie 傳遞(超鏈接除外),并且只有當使用 HTTPs 協議時,才有可能被允許在 AJAX 跨域請求中接受服務器傳來的 Cookie。

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

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

  1. // 獲取 token 
  2. var token = result.data.token; 
  3.  
  4. // 動態創建一個不可見的iframe,在iframe中加載一個跨域HTML 
  5. var iframe = document.createElement("iframe"); 
  6. iframe.src = "http://app1.com/localstorage.html"
  7. document.body.append(iframe); 
  8. // 使用postMessage()方法將token傳遞給iframe 
  9. setTimeout(function () { 
  10.     iframe.contentWindow.postMessage(token, "http://app1.com"); 
  11. }, 4000); 
  12. setTimeout(function () { 
  13.     iframe.remove(); 
  14. }, 6000); 
  15.  
  16. // 在這個iframe所加載的HTML中綁定一個事件監聽器,當事件被觸發時,把接收到的token數據寫入localStorage 
  17. window.addEventListener('message'function (event) { 
  18.     localStorage.setItem('token', event.data) 
  19. }, false); 

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

 

責任編輯:武曉燕 來源: 小明菜市場
相關推薦

2021-06-24 08:52:19

單點登錄代碼前端

2012-07-17 09:16:16

SpringSSH

2024-07-08 09:03:31

2010-03-12 17:52:35

Python輸入方式

2021-11-05 21:33:28

Redis數據高并發

2014-07-30 17:10:38

LVS集群負載均衡

2009-07-03 18:32:18

JSP頁面跳轉

2019-11-20 18:52:24

物聯網智能照明智能恒溫器

2014-12-31 17:42:47

LBSAndroid地圖

2020-11-01 17:10:46

異步事件開發前端

2010-06-13 16:04:14

MySQL三種安裝方式

2011-04-08 11:13:50

CISCO IOS令牌桶雙桶

2023-05-31 19:10:31

2015-01-16 17:41:45

數據中心模塊化

2010-08-24 09:43:33

2023-08-22 07:05:34

PowerShellWindows

2018-04-02 14:29:18

Java多線程方式

2017-07-14 15:07:23

2011-07-25 12:41:38

接入方式布線

2010-09-13 12:19:03

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜免费网站 | 伊人精品久久久久77777 | 中文字幕一区二区三区四区 | 一区二区三区精品视频 | 五月天综合网 | 在线只有精品 | 人人人人干 | 日本精品一区二区三区视频 | 二区av | 午夜视频免费在线观看 | 日韩欧美网 | 蜜桃av鲁一鲁一鲁一鲁 | a在线视频观看 | 久久久国产精品视频 | 亚洲视频国产 | 黑人巨大精品欧美一区二区免费 | 欧美一区二区三区免费电影 | 欧美日一区二区 | 午夜精品 | 狠狠久久 | 一区二区三区视频在线观看 | 欧美日批 | 欧美高清成人 | 精品在线一区 | 亚洲一区二区三区免费视频 | 成人av鲁丝片一区二区小说 | 国产精品毛片无码 | 暖暖日本在线视频 | 亚洲国产精品一区二区www | 亚洲高清在线 | 欧美日韩中文字幕 | 久久国产精品久久久久久 | 伊人性伊人情综合网 | 最新免费视频 | 亚洲成人免费视频在线观看 | 日韩午夜在线播放 | 精品一区二区三 | 精品亚洲一区二区 | 91视视频在线观看入口直接观看 | 欧美国产日韩在线观看 | 欧美精品久久久 |