有别于JS跨域、IFRAME跨域等的常用途理办法,通过发送P3P头信息而实现的跨域。

事理

P3P协议可以完成cookie的跨域设置,例如在A域下要求B域的某个方法,B域上加载此协议后可以实现通过A域的要求完成cookie设置,当然此cookie的域肯定是B域的。
说的大略些便是A域的cookie只能是在A域下设置,再若何也做不到在A域下设置一个B域的cookie,但可以通过A域向B域发送一个跨域要求,B域相应此要求,虽然此要求来至A域,在某些情形下(IE大法)依旧无法完成cookie的设置,但在P3P协议的帮助下,即B域上运行着P3P协议,就可以完美的吸收来至任何他域的要求来设置cookie了(再次强调,B域的cookie只能在B域下设置,若A域下就能设置B域的cookie先不说SOP协议当然无存,还没事折腾什么跨域)。

PHP 利用P3P协议

p3pphp单点登录解决计划P3P协定实现跨域Cookie设置 Docker

header('P3P: CP=\公众CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"大众');

JS利用P3P协议

xmlhttp.setRequestHeader( \公众P3P\"大众 , 'CP=\"大众CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"大众' );实现案例

www.b.com/set_cookie.php 在b域名下设置a域名的cookie:

<script src=\公众http://www.a.com/set_cookie.php\"大众></script>

www.a.com/get_cookie.php 在a域名下获取cookie:

print_r($_COOKIE);

www.a.com/set_cookie.php 在a域名下设置a域名的cookie:

header('P3P: CP=\公众CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"大众');setcookie(\"大众test\公众, \"大众test value\公众, time()+3600, \"大众/\公众);

访问www.b.com/set_cookie.php,然后访问www.a.com/get_cookie.php就可以获取cookie

实在,在chrome不用P3P头也可以获取到cookie,但是IE弗成,加上P3P头,IE也可以了。