本部落格為本人學習SSO單點登入時的學習筆記,主要參考了最強SSO單點登入教程(一)多系統的複雜性等系列課程。
一、會話機制
通常是指使用者浏覽器與伺服器進行通信的時間間隔,浏覽器和伺服器之間的會話是通過浏覽器的Cookie和伺服器中的Session來進行的。主要過程如下:
1.浏覽器第一次通路Tomcat伺服器時,伺服器會在服務端建立一個Session對象,并存儲在服務端維護的map中,其中key為Session對象的id,value為Session對象本身。打開tomcat管理頁面,我們可以看到如圖所示的服務端所建立的Session對象清單。

2. 同時,在服務端響應用戶端的時候,會把Session對象的id通過Cookie的方式寫入到用戶端浏覽器,浏覽器會把Session的id寫入到本地的Cookie中。可以通過谷歌浏覽器的開發者工具檢視這一過程,如圖所示。在響應頭(Response Headers)中,可以看到伺服器向浏覽器傳回的Set-Cookie資訊中有Sessionde的id,而在請求頭中(Request Header),Cookie中并沒有攜帶Session的資訊。
3.之後,每次浏覽器向伺服器發送請求,都會讀取本地的cookie中的内容,并在請求的時候帶上對應的cookie。可以通過谷歌浏覽器的開發者工具檢視這一過程,如圖所示。在響應頭(Response Headers)中,可以看到此時伺服器向浏覽器傳回的Set-Cookie資訊中沒有Sessionde的id(隻在第一次請求的時候才會傳回),而在請求頭中(Request Header),Cookie攜帶了Session的資訊。
主要過程如圖所示。
二、登入機制
通過上面會話機制的介紹,當我們向伺服器發送請求的時候就建立了一個會話(Session對象)。當我們拿到這個Session對象的時候,下一步我們需要考慮這個Session對象如何去使用?
我們知道,通過Session機制,使得伺服器能夠識别出不同的浏覽器以及同一浏覽器的多次請求。
我們假設浏覽器第一次請求伺服器需要輸入使用者名與密碼驗證身份,伺服器拿到使用者名密碼去資料庫比對,正确的話說明目前持有這個會話的使用者是合法使用者,應該将這個會話标記為“已授權”或者“已登入”等等之類的狀态,既然是會話的狀态,自然要儲存在會話對象中,Tomcat在會話對象中設定登入狀态如下:
HttpSession session = request.getSession();
session.setAttribute("isLogin", true);
使用者再次通路時,tomcat在會話對象中檢視登入狀态:
HttpSession session = request.getSession();
session.getAttribute("isLogin");
實作了登入狀态的浏覽器請求伺服器模型如下圖描述:
經過上述過程,我們便通過了會話機制實作了單系統的登入機制。