1. 程式人生 > >Cookie實現同域,跨域單點登入

Cookie實現同域,跨域單點登入

[javascript] view plain copy print?
  1. Cookie 同域單點登入  
  2. 最近在做一個單點登入的系統整合專案,之前我們使用控制元件實現單點登入(以後可以介紹一下)。但現在為了滿足客戶需求,在不使用控制元件情況下實現單點登入,先來介紹一下單點登入。  
  3. 單點登入:多個不同系統整合到統一載入個平臺,使用者在任何一個系統登入後,可以訪問這個統一載入上的所有系統。登入之後,使用者的許可權和資訊不再受某個系統的限制,即使某個系統出現故障(包括統一載入平臺),其他系統還是能正常使用的。這就需要使用者許可權等資訊儲存到客戶端,不受伺服器的限制。  
  4. 在cookie相關文件資訊中,提到cookie是不能跨域訪問的,但是在二級域名是可以共享cookie的。這樣就是我們的專案有了侷限性,必須將多個系統的域名統一,作為二級域名,統一平臺提供使用主域名。這樣就可以實現cookie的單點登入了。  
  5. 在這裡介紹一下cookie:  
  6. 1.cookie是一個儲存在客戶端的字串屬性,可以用它對當前網頁的cookie進行讀,寫,增.刪等操作;javascript能夠用document物件的cookie屬性對cookie進行操作;  
  7. 2.cookie的四個可選屬性:  
  8. 2.1 cookie的生存期屬性:expires;預設情況下,cookie只在瀏覽器會話期存在.退出瀏覽器就丟失;可以用expires設定時間;退出瀏覽器後就不會丟失並存為客戶端瀏覽器的cookie檔案;過了時間後cookie失效,還會自動刪除cookie檔案.  
  9. 2.2 path屬性:預設情況下,在同一個目錄下檔案可以呼叫;  
  10. 例如:http://hanj.com/c1/1.html設定的cookie可以被http://hanj.com/c1/2.html呼叫.但不能被http://hanj.com/c2/目錄下的檔案呼叫;
  11. 但如把path屬性設成"/";則在http://hanj.com/下的所有檔案都可呼叫此cookie.
  12. 2.3 domain屬性:例如設成".hanj.com"則在.hanj.com下的所有伺服器下的檔案都可以呼叫cookie.  
  13. 2.4 安全屬性:預設情況下為false;用http協議不安全傳輸;true:用https等協議安全傳輸.  
  14. 3.cookie的侷限性:  
  15. 瀏覽器最多儲存300個cookie;為單個web伺服器的最多隻能儲存20個cookie;每個cookie不能超過4000個位元組.  
  16. 單點登入實現環境:  
  17. 統一平臺域名:www.hanj.com  
  18. 子系統1:a.hanj.com  
  19. 子系統2:b.hanj.com  
  20. 子系統3:c.hanj.com  
  21. 統一載入平臺和各子系統都是不同的伺服器,統一載入平臺提供登入認證服務,在統一載入平臺認證系統上登入後,使用者都可以被其他的系統識別。  
  22. /** 
  23. 函式名稱:getCookie 
  24. 函式功能:獲取指定名稱的cookie的值 
  25. 輸入引數:需要測試的字串 
  26. 返回引數: 
  27. */
  28. function getSSOCookie()  
  29. {  
  30.     var arrStr = document.cookie.split("; ");  
  31.     for(var i = 0;i < arrStr.length;i ++){  
  32.         var temp = arrStr[i].split("=");  
  33.         if(temp[0] == "sso") {  
  34.           return unescape(temp[1]);  
  35.         }  
  36.     }  
  37.     return"";  
  38. }  
  39. /** 
  40. 函式名稱:addCookie 
  41. 函式功能:新增cookie 
  42. 輸入引數:需要測試的字串 
  43. 返回引數: 
  44. */
  45. function addSSOCookie(objValue)  
  46. {  
  47.     var str = "sso" + "=" + escape(objValue);  
  48.     if(true){//為0時不設定過期時間,瀏覽器關閉時cookie自動消失
  49.         str += "; path=/";  
  50.     }  
  51.     document.cookie = str;  
  52. }  
  53. /** 
  54. 函式名稱:delCookie 
  55. 函式功能:刪除cookie 
  56. 輸入引數:需要測試的字串 
  57. 返回引數: 
  58. */
  59. function delCookie()  
  60. {//為了刪除指定名稱的cookie,可以將其過期時間設定為一個過去的時間
  61.     var date =  new  Date();  
  62.     date.setTime(date.getTime() - 10000);  
  63.     document.cookie = "sso" + "=a; expires=" + date.toGMTString()+"; path=/";  
  64. }  
  65. 使用者在統一載入平臺認證系統認證通過後,使用addSSOCookie,使用者許可權資訊儲存到了cookie中,其他平臺通過呼叫getSSOCookie,取得使用者資訊。這樣使用者就可以不再受平臺限制,而實現自由訪問各個系統了。  
  66. 在addSSOCookie方法中,沒有設定cookie的失效時間,這樣在瀏覽器關閉後,cookie就自動消失。注意:這樣cookie的有效性只能在同一瀏覽器程序,如果重新打開了一個瀏覽器程序,cookie資訊是獲取不到的,也就是單點登入只能在同一個瀏覽器程序有效。如果想在不用瀏覽器程序中共享cookie資訊,那就設定失效時間,如下:  
  67. function addCookie(objValue,objHours){//新增cookie
  68.             var str = "sso""=" + escape(objValue);  
  69.             if(objHours > 0){//為0時不設定過期時間,瀏覽器關閉時cookie自動消失
  70.                 var date = new Date();  
  71.                 var ms = objHours*3600*1000;  
  72.                 date.setTime(date.getTime() + ms);  
  73.                 str += "; expires=" + date.toGMTString()+"; path=/; domain=.hanj.com";  
  74.             }  
  75.             document.cookie = str;  
  76.         }  
  77. 這樣cookie在指定的時間後失效。但這樣安全性不能保證,如果時間設定太短,使用者在使用中,可能cookie就失效了,需要重新登入。如果時間過長,使用者在下次訪問,或電腦重起訪問,cookie還在有效期中,有可能別其他人使用。cookie不能準確的刪除,存在安全隱患。  
Cookie 同域單點登入
 	 
最近在做一個單點登入的系統整合專案,之前我們使用控制元件實現單點登入(以後可以介紹一下)。但現在為了滿足客戶需求,在不使用控制元件情況下實現單點登入,先來介紹一下單點登入。

單點登入:多個不同系統整合到統一載入個平臺,使用者在任何一個系統登入後,可以訪問這個統一載入上的所有系統。登入之後,使用者的許可權和資訊不再受某個系統的限制,即使某個系統出現故障(包括統一載入平臺),其他系統還是能正常使用的。這就需要使用者許可權等資訊儲存到客戶端,不受伺服器的限制。

在cookie相關文件資訊中,提到cookie是不能跨域訪問的,但是在二級域名是可以共享cookie的。這樣就是我們的專案有了侷限性,必須將多個系統的域名統一,作為二級域名,統一平臺提供使用主域名。這樣就可以實現cookie的單點登入了。

在這裡介紹一下cookie:

1.cookie是一個儲存在客戶端的字串屬性,可以用它對當前網頁的cookie進行讀,寫,增.刪等操作;javascript能夠用document物件的cookie屬性對cookie進行操作;

2.cookie的四個可選屬性:

2.1 cookie的生存期屬性:expires;預設情況下,cookie只在瀏覽器會話期存在.退出瀏覽器就丟失;可以用expires設定時間;退出瀏覽器後就不會丟失並存為客戶端瀏覽器的cookie檔案;過了時間後cookie失效,還會自動刪除cookie檔案.

2.2 path屬性:預設情況下,在同一個目錄下檔案可以呼叫;
例如:http://hanj.com/c1/1.html設定的cookie可以被http://hanj.com/c1/2.html呼叫.但不能被http://hanj.com/c2/目錄下的檔案呼叫;
但如把path屬性設成"/";則在http://hanj.com/下的所有檔案都可呼叫此cookie.

2.3 domain屬性:例如設成".hanj.com"則在.hanj.com下的所有伺服器下的檔案都可以呼叫cookie.

2.4 安全屬性:預設情況下為false;用http協議不安全傳輸;true:用https等協議安全傳輸.

3.cookie的侷限性:

瀏覽器最多儲存300個cookie;為單個web伺服器的最多隻能儲存20個cookie;每個cookie不能超過4000個位元組.

單點登入實現環境:

統一平臺域名:www.hanj.com

子系統1:a.hanj.com

子系統2:b.hanj.com

子系統3:c.hanj.com

統一載入平臺和各子系統都是不同的伺服器,統一載入平臺提供登入認證服務,在統一載入平臺認證系統上登入後,使用者都可以被其他的系統識別。

 

/**
函式名稱:getCookie
函式功能:獲取指定名稱的cookie的值
輸入引數:需要測試的字串
返回引數:
*/
function getSSOCookie()
{
    var arrStr = document.cookie.split("; ");
    for(var i = 0;i < arrStr.length;i ++){
        var temp = arrStr[i].split("=");
        if(temp[0] == "sso") {
          return unescape(temp[1]);
        }
    }
    return "";
}
/**
函式名稱:addCookie
函式功能:新增cookie
輸入引數:需要測試的字串
返回引數:
*/
function addSSOCookie(objValue)
{
    var str = "sso" + "=" + escape(objValue);
    if(true){//為0時不設定過期時間,瀏覽器關閉時cookie自動消失
        str += "; path=/";
    }
    document.cookie = str;
}

/**
函式名稱:delCookie
函式功能:刪除cookie
輸入引數:需要測試的字串
返回引數:
*/
function delCookie()
{//為了刪除指定名稱的cookie,可以將其過期時間設定為一個過去的時間
    var date =  new  Date();
    date.setTime(date.getTime() - 10000);
    document.cookie = "sso" + "=a; expires=" + date.toGMTString()+"; path=/";
}
 

使用者在統一載入平臺認證系統認證通過後,使用addSSOCookie,使用者許可權資訊儲存到了cookie中,其他平臺通過呼叫getSSOCookie,取得使用者資訊。這樣使用者就可以不再受平臺限制,而實現自由訪問各個系統了。

在addSSOCookie方法中,沒有設定cookie的失效時間,這樣在瀏覽器關閉後,cookie就自動消失。注意:這樣cookie的有效性只能在同一瀏覽器程序,如果重新打開了一個瀏覽器程序,cookie資訊是獲取不到的,也就是單點登入只能在同一個瀏覽器程序有效。如果想在不用瀏覽器程序中共享cookie資訊,那就設定失效時間,如下:

function addCookie(objValue,objHours){//新增cookie
            var str = "sso"+ "=" + escape(objValue);
            if(objHours > 0){//為0時不設定過期時間,瀏覽器關閉時cookie自動消失
                var date = new Date();
                var ms = objHours*3600*1000;
                date.setTime(date.getTime() + ms);
                str += "; expires=" + date.toGMTString()+"; path=/; domain=.hanj.com";
            }
            document.cookie = str;
        }
 

這樣cookie在指定的時間後失效。但這樣安全性不能保證,如果時間設定太短,使用者在使用中,可能cookie就失效了,需要重新登入。如果時間過長,使用者在下次訪問,或電腦重起訪問,cookie還在有效期中,有可能別其他人使用。cookie不能準確的刪除,存在安全隱患。
[javascript] view plain copy print?
  1. Cookie跨域單點登入  
  2. 為了快速、簡單的實現這一功能,首先想到就是通過JS操作Cookie並讓兩個不同域的cookie能夠相互訪問,這樣就可達到了上述的效果,具體實現過程大致可分以下兩個步驟:  
  3. 1、在A系統下成功登入後,利用JS動態建立一個隱藏的iframe,通過iframe的src屬性將A域下的cookie值作為  
  4. get引數重定向到B系統下b.aspx頁面上;  
  5. var _frm = document.createElement("iframe");  
  6. _frm.style.display="none";   
  7. _frm.src="http://b.com/b.jsp?test_cookie=xxxxx";   
  8. document.body.appendChild(_frm);     
  9. 2、在B系統的b.aspx頁面中來獲取A系統中所傳過來的cookie值,並將所獲取到值寫入cookie中,這樣就簡單的實現了cookie跨域的訪問; 不過這其中有個問題需要注意,就是在IE瀏覽器下這樣操作不能成功,需要在b.aspx頁面中設定P3P HTTP Header就可以解決了(具體詳細資訊可以參考:http://www.w3.org/P3P/),P3P設定程式碼為:
  10. /* 
  11. *也可以在html加入標記 
  12. <meta http-equiv="P3P" content='CP="IDC DSP COR CURa ADMa  OUR IND PHY ONL COM STA"'>   
  13. */
  14. Response.AppendHeader("P3P""CP='IDC DSP COR CURa ADMa  OUR IND PHY ONL COM STA'");