利用P3P实现单点登录和COOKIE的跨域读写
首先说明,同一个顶级域名的情况我不说什么,很简单,就一个Cookie的Domain属性。
下面来说顶级域名不同的情况。
有时候我们会有这么一种需求:当我们登录A网站www.a.com时,同时也要能登录B网站www.b.com,继而访问B网站需要登录才能看到的信息。这个时候怎么办呢?那有人会说用SSO(单点登录)来做。SSO可能会有多种的实现方式,但是我们这里只介绍利用P3P来实现的方式。也就是如标题所说:利用P3P实现单点登录和COOKIE的跨域读写。
至于P3P是什么,我也不是很清楚,如果想知道,去问百度吧。还有如果您对P3P还不怎么认可,那么我就多说一句:DISCUZ论坛和PhpcmsV9都是通过这种方式来实现单点登录的,怎么样?这下认可了吧?
下面贴出例子,供大家参考。
A网站有两个页面,一个用来设置COOKIE,如下:
index.asp
<% Dim username : username = "subendong" Response.Cookies("username") = username %> <iframe src="http://www.b.com/index.asp?username=<%=username%>"></iframe> <script type="text/javascript"> window.location.href = "http://www.b.com/show.asp"; </script>
一个用来读取COOKIE
main.asp
<% Response.Write(Request.Cookies("username")) %>
特别注意:在做登录的时候,如果登录之后想立即跳转的话,不能用服务器端脚本Redirect,必须用Javascript的window.location.href跳转。信不信由你。
B网站有两个页面,一个是用来同步设置COOKIE的,如下:
index.asp
<% Response.AddHeader "P3P", "CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" Response.Cookies("username") = Request("username") Response.Write(Request.Cookies("username")) %>
另一个是是访问COOKIE的,如下:
show.asp
<% Response.Write(Request.Cookies("username")) %>
代码是用ASP写的,PHP和ASP.NET或者JSP原理都是一样的。
看完代码是不是觉得很简单?不像以前别人写的那么复杂。看懂的支持下吧。
这里有个地方需要注意:如果没有实现效果,估计是因为使用iframe时,www.b.com站点还没有成功写入cookie,这时你可以使用setTimeout()来延迟转向。