iframe跨域session丟失問題

handawei_5發表於2010-07-09

最近在做一個系統(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'" />

相關文章