setcookie();中的第五個參數是域名參數domain
這個參數如果是.domain.com那么這個cookie可以在主域名或者任意子域名都能夠獲取。相同域名下。子域名間可以相互共享。但是不相同的域名下不能直接共享。
不同(主)域名直接可以通過嵌套的方式生成cookie,通過A域名下的頁面嵌套B域名下的連接,從而生成B域名的cookie。但是不能直接相互共享。
嵌套的方式在ie下可能會被阻止,不同的瀏覽器對第三方生成cookie是有着不同的權限的。因此用到p3p開啟ie的權限允許第三方生成cookie
header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');//p3p
sso單點登錄
A登錄之后,產生一個標示,帶着這個標示去訪問B(判斷是否登錄成功),再獲取數據。
只要sessionid知道 就可以去找鏈接池找到登錄狀態
相同域名下的子域名直接相對簡單:
子域名下setcooke.php
<?php //假如登錄成功了 //在子域名下生成一個共享cookie $gongxiang = "zhuliuyang"; setcookie("gongxiang",$gongxiang,time()+3600,"/",".cs.com");//設置共享的cookie session_id($gongxiang);//設置session_id session_start();//開啟 session $_SESSION['isLogin'] = '1'; echo "set success";
主域名下判斷是否登錄
<?php if(isset($_COOKIE['gongxiang']) && $_COOKIE['gongxiang']!=false) { session_id($_COOKIE['gongxiang']);//獲取共享cookie並設置session_id } session_start();//開啟session echo "<pre>"; var_dump($_COOKIE); var_dump($_SESSION); echo "</pre>"; ?>
運行結果:
清除cookie之后。是兩個空數組。
不同主域名下原理也是一樣的。前提是在同一服務器上。不在同一服務器上,那么session的連接池就找不到了。
對於只允許一個客戶端登陸的問題。需要把登陸成功的sessionid存起來,登陸成功之后的sessionid與保存的sessionid 作對比。一樣的話則是同一客戶端。不一樣的話改變登陸狀態(改變保存sessionid的登陸狀態,強制退出)。
在不同的服務器上可以把登錄狀態存到統一的數據庫中或者文件中。再進行判斷
對於不同的主域名之間的sso登陸:通過url連接的標識到保存登陸狀態的服務器去驗證登陸狀態,返回結果。再取數據
(未完待續)