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

相關文章
相關標籤/搜索