iframe跨域,“須將cookie打開”異常

? ? ? ?近期有個項目的頁面中,調(diào)用的第三方的控件,是采用iframe嵌入頁面。在現(xiàn)場IE7環(huán)境下死活出現(xiàn)“須將cookie打開”異常。

? ? ? ? 作為一個有追求的程序員,我想應該是iframe的cookie權(quán)限有關(guān),然后就搜iframe cookie果然找到原因,詳見問題來源,簡而言之,就是IE由于安全性考慮,將iframe嵌入式訪問第三方網(wǎng)站的session/cookie失效。


? ? ? 所以解決方法也就出來了,

? ? ? 一種是降低IE安全級別,或者對指定網(wǎng)站打開cookie。但是由于項目涉及多臺客戶端,不能去每臺電腦依次操作,因此這個不作為考慮。

? ? ? 另外,就是需要在第三方網(wǎng)站(注意是iframe嵌入頁面方,之前在主頁面中加測試半天,我也是醉了)中使用P3P修改安全級別,

? ? java: response.setHeader("P3P","CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

? JSP:<% response.addHeader("P3P", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""); %>

? ? ?如果第三方網(wǎng)站如果無法協(xié)調(diào)修改,可以采用在網(wǎng)站服務器上設置,例如這個項目是IIS服務器

打開IIS服務-》網(wǎng)站-》某網(wǎng)站->設置-》http 響應頭

添加標頭:名稱P3P ?,?值CP=CAO PSA OUR

? ? ? 輕松搞定,也是大開腦洞了。附上各個瀏覽器對第三方cookie的支持,因為我們的項目指定IE,因此其他的也就沒有進行測試咯,各位可以參考。


不同瀏覽器的第三方 cookie 規(guī)則

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 限制第三方coookie

IE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?是

FireFox ? ? ? ? ? ? ? ? ? ? ?否

Chrome ? ? ? ? ? ? ? ? ? ? ?否

Safari ? ? ? ? ? ? ? ? ? ? ? ? 是

Opera ? ? ? ? ? ? ? ? ? ? ? ? 否



問題來源:來自http://www.myexception.cn/web/1662712.html

何為跨域跨域session/cookie?

也就是第三方session/cookie。第一方session/cookie指的是訪客當前訪問的網(wǎng)站給訪客的瀏覽器設置的seesion/cookie, 會被存儲在訪客的計算機上。第三方session/cookie指的是當前訪問的網(wǎng)站中會加載(嵌入)另外第三方的網(wǎng)站代碼,例如促銷廣告,那么第三方網(wǎng)站也會在訪客的計算機上添加session/cookie,這種就是第三方session/cookie。

IE限制第三方session/cookie

隨著IE版本的不斷更新,版本之間變化很大,其兼容性問題困擾著許多開發(fā)者。本問題也不例外,IE7以后,微軟逐漸改進了IE安全性,其中默認設置下第三方session/cookie是不允許使用的,這就造成了使用iframe嵌入式訪問另外的第三方網(wǎng)站時,不能為其保存會話狀態(tài),無法進行登錄或跨越取值,從而影響第三方網(wǎng)站功能的使用。

解決方法

手動調(diào)整客戶端IE瀏覽器的安全級別

在Internet選項-隱私卡中,調(diào)低安全級別到接受所有cookie,或者在[高級]中設置接受第三方cookie。

點評:此方法需要使用者更改客戶端瀏覽器設置,極不便利,且會給使用者電腦帶來安全隱患,故不推薦。

代碼中使用P3P協(xié)議自動更改IE瀏覽器安全級別

P3P(Platform for Privacy Preferences)是一種可以提供這種個人隱私保護策略。具體做法是在被iframe嵌入的第三方網(wǎng)站代碼中加入如下代碼:

[java]view plaincopy

response.setHeader("P3P","CP=\"IDC?DSP?COR?ADM?DEVi?TAIi?PSA?PSD?IVAi?IVDi?CONi?HIS?OUR?IND?CNT\"");

要注意的有:

1、上段代碼是jsp的,如果是asp或php等,需要改成相應的語法,參數(shù)和取值不變。如ruby為:

[ruby]view plaincopy

response.headers["P3P"]?="CP=\"IDC?DSP?COR?ADM?DEVi?TAIi?PSA?PSD?IVAi?IVDi?CONi?HIS?OUR?IND?CNT\""

2、此方法僅支持動態(tài)Web應用,也就是需要使用動態(tài)語言設置response的header,且如果是MVC架構(gòu)的話,最好是在總控制器或過濾器中添加上段代碼,這樣改動最小。

點評:該方法不需要手動修改客戶端IE設置,但需要修改第三方網(wǎng)站的代碼,對于第三方網(wǎng)站不在控制范圍內(nèi)情況下無能為力。

在第三方網(wǎng)站服務器中設置P3P協(xié)議

第三方網(wǎng)站所使用的應用服務器程序,如果支持設置HTTP頭,那么可以通過設置服務器而不必修改第三方網(wǎng)站代碼。

例如IIS下,可以打開IIS窗口——〉選擇一個網(wǎng)站——〉屬性——〉http頭,增加一個http頭

然后輸入頭名:P3P

輸入頭內(nèi)容:CP=CAO PSA OUR

點評:與上一個方法類似,此方法也要求第三方在可控可管理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容