session跨域丢失问题
以前做过一个系统,需要在系统(A)中集成目前现存系统(B)的功能。
因为系统B做了权限控制,所以在系统A的数据库建立跟系统B一样的权限表,然后登录系统A后,将用户信息、权限信息等存放进session中,然后在系统B进行权限验证。
理论上这种设计在不使用框架结构时,完全是可行的。但是如果,系统A使用了框架结构,即系统(B)中的功能页面要嵌入到系统(A)的框架中时,系统B取不到session值了,既session丢失了。
原来是因为应用需求在一个页面的不同frame下面访问不同的域,结果造成了session丢失。
问题根源:
IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存在此问题了。Mircosoft对此的具体描述可以参见 Privacy in Internet Explorer 6
解决办法是在要嵌入的内容中(iframe指向的站点)输出P3P的主机头声明:
php:
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
asp.net:
HttpContext.Current.Response.AddHeader("p3p", "CP=\""IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""")
jsp:
response.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'")
ColdFusion:
<cfheader name="P3P" value="CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'" />