iframe跨域session丢失问题

在作项目的时候,碰到一个很棘手的问题。在一个应用中经过iframe的方式嵌入另外一web应用,可是session中明明放了值,可是就是死活获取不到。几经周折,终于皇天不负有心人,总算找到了关键命脉所在。php

 

最近在作一个系统(A),须要在系统(A)中集成目前现存系统(B)的功能。 
  固然,系统(B)功能在访问时作了登录限制。(通常性都是:系统登录后把userId放入session中,在具体的功能页面加入session中userId的判断, 
  若是session中userId不存在,则跳到登录页,不然继续加载并正常显示功能。) 
  那么,在系统(A)中要访问系统(B)的功能无非是要绕过系统(B)的登录。(通常的作法是先跳转到系统(B)中的一个页面,在这个页面里将userId塞入session中, 
  再自动跳转到实际要访问的功能页面) 
  以上作法,在不使用框架结构时,是可行的,确切的说是很简单的。 
  可是若是,系统(A)使用了框架结构,即系统(B)中的功能页面要嵌入到系统(A)的框架中,则会出现一些意想不到的问题, 
  确切说是系统(B)跳转到了登录页面,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'" />web

相关文章
相关标签/搜索