版權聲明:本文爲博主原創文章,轉載請註明出處http://blog.csdn.net/ghsau。html
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20545513,轉載請註明。
徹底跨域的單點登陸實現方案基本和上篇文章介紹的同樣,只不過生成ticket的過程更復雜些。上篇文章中的項目是不能徹底跨域的,因爲多個應用系統以及認證系統域不一樣,也沒有共同的父域,致使登陸後,認證系統向瀏覽器寫的ticket在其它應用系統中獲取不到,這時訪問其它應用系統時,沒有攜帶着ticket的cookie,沒法認證也沒法單點登陸。那解決的方案是每一個應用系統都向瀏覽器cookie中寫入ticket,請看下圖,圖中淺藍色圓角區域表明不一樣的域,當用戶經過瀏覽器第一次訪問應用系統1時,因爲尚未登陸,會被引導到認證系統進行登陸。下面開始單點登陸的過程:認證系統根據用戶在瀏覽器中輸入的登陸信息,進行身份認證,若是認證經過,返回給瀏覽器一個證實[認證系統_ticket];這時再經過瀏覽器將[認證系統_ticket]發送到到應用系統1的設置cookie的url,應用系統1返回給瀏覽器一個證實[應用系統1_ticket],這時再將請求重定向到最初訪問的頁面,之後應用系統1就能夠自動登陸了。如今用戶訪問了應用系統2,因爲應用系統2沒有生成過cookie(可是用戶已經在應用系統1登陸過一次了),將請求重定向到認證系統;認證系統檢測到已經生成過[認證系統_ticket]了,認證經過;再經過瀏覽器將[認證系統_ticket]發送到到應用系統2的設置cookie的url,應用系統2返回給瀏覽器一個證實[應用系統2_ticket],這時再將請求重定向到最初訪問的頁面。應用系統3也一樣原理,咱們等於將ticket作了一次同步,保證了每一個應用系統都有一份認證系統產生的ticket。剩餘的ticket驗證過程和上篇文章同樣了。web
ticket同步的過程用jsonp應該也能夠實現,我基於上篇文章中的項目實現了徹底跨域的單點登陸,能夠在這裏下載項目。json
域名準備跨域
修改hosts文件,映射3個域名:瀏覽器
[html] view plain copy服務器
三個域名都是獨立的,沒有共同父域,web1和web2用於訪問應用系統,passport用於訪問認證系統。app
項目部署jsp
項目中包含的是兩個Eclipse Project,導入到Eclipse/MyEclipse後,可能須要設置下JavaEE類庫。WebSSOAuth爲認證系統,WebSSODemo爲應用系統,若是映射的域名和我設置的同樣,不須要設置,直接部署便可。若是不同,須要修改下WebSSODemo/WEB-INF/web.xml文件。關鍵配置信息以下:jsonp
[html] view plain copy
若是域名或端口號和個人不一致,能夠修改對應配置項。最後部署到應用服務器中,啓動服務器。
SSO使用
首先輸入第一個應用系統的訪問地址,http://web1.com:8080/WebSSODemo/index.jsp,若是是第一次訪問的話,會自動跳轉到登陸頁,以下圖:
系統中內置了3個用戶,張3、李4、王五,用戶名和密碼皆爲拼音全拼,輸入zhangsan/zhangsan登陸後,會自動跳轉到咱們剛纔訪問的頁面,頁面中顯示了登陸的用戶名及歡迎信息,以下圖:
這時,咱們再輸入第二個應用系統的訪問地址,http://web2.com:8080/WebSSODemo/index.jsp,咱們發現,沒有進行第二次登陸,一樣頁面中顯示了登陸的用戶名及歡迎信息,以下圖:
咱們接着點擊Logout註銷用戶,頁面跳轉到了登陸頁面,這時咱們再回頭訪問第一個應用系統的頁面,發現一樣跳轉到了登陸頁面。
互聯網中的徹底跨域登陸的站點也有不少,如淘寶和天貓,但確定不是我這樣實現的。個人實現中,認證系統和應用系統是經過url參數來傳遞ticket,可能存在一些不穩定因素。應用系統的每次請求都會經過HTTP遠程到認證系統進行驗證ticket,速度上應該會慢一些,這裏能夠改進一步,在每一個應用系統中也維護一份tickets,驗證時,首先到本系統中驗證,若是不存在,再遠程到認證系統進行驗證,但這也增長了應用系統的代碼量。本文完,若是有什麼問題,歡迎討論。
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20545513,轉載請註明。