PHP使用P3P完成COOKIE跨域操作
實際實用中,類似的需求有,比如說我們有兩個域名,我們想實現在一個域名登錄后,能自動完成另一個域名的登錄,也就是單點登錄(SSO)功能。
為了測試的方便,先編輯hosts文件,加入測試域名
sudo vim /etc/hosts
192.168.1.112 www.a.com
192.168.1.112 www.b.com
代碼實現
www.a.com域名下的代碼文件:
[a_setcookie.php]
//header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test", $_GET['id'], time()+3600, "/", ".a.com");
?>
[a_getcookie.php]
var_dump($_COOKIE);
?>
www.b.com域名下的代碼文件:
[b_setcookie.php]
//header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test", $_GET['id'], time()+3600, "/", ".b.com");
?>
[b_getcookie.php]
var_dump($_COOKIE);
?>
依次訪問
http://www.b.com/b_setcookie.php
http://www.a.com/a_getcookie.php
會發現a.com域上已經有cookie值了
代碼分析
在www.b.com的域名下給www.a.com創建cookie。
若用戶登錄到www.b.com中,由此域名的b_setcookie.html中js實現方式給www.a.com域名設置cookie。
假設www.a.com域名下的a_getcookie.php有cookie則設定www.a.com登錄成功。
b_setcookie.html:
總結P3P的在上述代碼中最主要的職責是:
跨域產生 cookie
注:上述代碼在非IE下測試,即使不發送P3P頭信息,也能成功。IE瀏覽器必需發送P3P才能成功!所以要跨域產生cookie還是有必要發送P3P的,畢竟IE的用戶群體還是很大的。