在作項目的時候,碰到一個很棘手的問題。在一個應用中經過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