版權聲明:本文爲博主原創文章,轉載請註明出處http://blog.csdn.net/ghsau。html
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,轉載請註明。
單點登陸(Single Sign On),簡稱爲SSO,SSO不只在企業級開發很經常使用,在互聯網中更是大行其道。隨便舉幾個例子,好比咱們登陸新浪微博後,再訪問新浪首頁後,咱們發現,已經自動登陸了;再好比咱們登陸CSDN後,能夠寫博客、逛論壇、下載資源等等。前者是徹底跨域的單點登陸,下文會講,後者是共同父域下(www.csdn.net、blog.csdn.net、bbs.csdn.net、passport.csdn.net)的單點登陸,也就是本文的主要內容。
單點登陸其實是「身份認證」的整合,當咱們存在多個應用時,咱們但願登陸了其中的一個應用,再訪問其餘應用時,會自動登陸,避免用戶重複的體力勞動。單點登陸的實現原理是比較簡單的,以下圖所示,當用戶經過瀏覽器第一次訪問應用系統1時,因爲尚未登陸,會被引導到認證系統進行登陸。下面開始單點登陸的過程:認證系統根據用戶在瀏覽器中輸入的登陸信息,進行身份認證,若是認證經過,返回給瀏覽器一個證實ticket(票);用戶再訪問其它應用系統時,會帶着ticket;應用系統接收到ticket後,會將其發送到認證系統進行合法性校驗;校驗經過後,用戶就不須要再次輸入用戶名密碼來登陸了,從而實現了單點登陸的功能。java
上面描述的過程其實是WEB-SSO。要實現SSO,首先必需要有統一的認證系統,其次每一個應用系統都經過認證系統來校驗用戶,因此這須要兩方面的配合。WEB-SSO是比較好實現的,尤爲是共同父域的狀況下,咱們能夠經過瀏覽器的cookie來保存ticket。今天我用Servlet技術實現了SSO的主要功能,能夠在這裏下載項目。web
域名準備跨域
修改hosts文件,映射3個域名:瀏覽器
[html] view plain copy服務器
3個域名必須擁有共同父域(.ghsau.com),web1和web2用於訪問應用系統,passport用於訪問認證系統。app
項目部署dom
項目中包含的是兩個Eclipse Project,導入到Eclipse/MyEclipse後,可能須要設置下JavaEE類庫。WebSSOAuth爲認證系統,WebSSODemo爲應用系統,若是映射的域名和我設置的同樣,不須要設置,直接部署便可。若是不同,須要修改下兩個項目的web.xml文件。關鍵配置信息以下:
WebSSOAuth/WEB-INF/web.xml:jsp
[html] view plain copy
WebSSODemo/WEB-INF/web.xml:[html] view plain copy
若是域名或端口號和個人不一致,能夠修改對應配置項。最後部署到應用服務器中,啓動服務器。
SSO使用
首先輸入第一個應用系統的訪問地址,http://web1.ghsau.com:8080/WebSSODemo/index.jsp,若是是第一次訪問的話,會自動跳轉到登陸頁,以下圖:
系統中內置了3個用戶,張3、李4、王五,用戶名和密碼皆爲拼音全拼,輸入zhangsan/zhangsan登陸後,會自動跳轉到咱們剛纔訪問的頁面,頁面中顯示了登陸的用戶名及歡迎信息,以下圖:
這時,咱們再輸入第二個應用系統的訪問地址,http://web2.ghsau.com:8080/WebSSODemo/index.jsp,咱們發現,沒有進行第二次登陸,一樣頁面中顯示了登陸的用戶名及歡迎信息,以下圖:
咱們接着點擊Logout註銷用戶,頁面跳轉到了登陸頁面,這時咱們再回頭訪問第一個應用系統的頁面,發現一樣跳轉到了登陸頁面。這給用戶的使用效果就是,一個應用登陸了,其它的應用都會自動登陸,而一個應用中註銷了,其它的應用也都會自動註銷,好神奇的樣子。
項目中提供了源碼,代碼的實現思路就是上面的那個圖,ticket保存在cookie中,利用cookie域的特性,實現了ticket在不一樣應用中都可以獲取到,ticket的驗證過程是使用了HttpClient來發送的驗證請求,ticket的加密使用了3DES,具體能夠看DESUtils.Java,好了,就到這裏吧,若是有什麼問題,歡迎討論。
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,轉載請註明。