最近在做一個項目需要用到IFRAME,發現IE在對iframe裡面的頁面寫Cookie的時候有一些安全限制,導致寫入和讀取Cookie不成功,找了好長時間的解決辦法,重要找到如下的辦法:
1.頁面裡的COOKIE不能是瀏覽器進程的COOKIE(包括驗證票和不設定逾時時間的COOKIE),否則跨域會取不到.這點做跨域 COOKIE的人比較少提到.不過實際上留意下幾家大學做的方案,有細微的提到他們的驗證模組裡的COOKIE是有設定逾時時間的.
2.當利用IFRAME時,記得要在相應的動態網頁的頁頭添加一下P3P的資訊,否則IE會自覺的把IFRAME框裡的COOKIE給阻止掉,產生問題.本身不儲存自然就取不到了.這個其實是FRAMESET和COOKIE的問題,用FRAME或者IFRAME都會遇到.
3.測試時輸出TRACE,會減少很多測試的工作量.
只需要設定 P3P HTTP Header,在隱含 iframe 裡面跨網域設定 cookie 就可以成功。他們所用的內容是:
P3P: CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'
ASP直接在頭部加了頭部申明,測試有效。
<%Response.AddHeader "P3P", "CP=CAO PSA OUR"%>
php的話,應該是如下寫法:
header('P3P: CP=CAO PSA OUR');
ASP.NET的話
通過在代碼上加Response.AddHeader("P3P", "CP=CAO PSA OUR")或者在Window服務中將ASP.NET State Service 啟動。
JSP:
response.setHeader("P3P","CP=CAO PSA OUR")
或者
| Iframe 中 Cookie 傳遞不丟失的問題解決 |
| [ 2007-7-19 10:51:00 | By: 飛揚人生 ] |
如果 iframe 另一個頁面,登入容易丟失,如部落格裡採用了次層網域,那麼使用者在次層網域中不能登入。如果兩套系統整合,登入時也容易這樣,這是IE的安全限制。這裡有一個簡單方法解決。問題描述:我們這邊有兩個系統,一個OA系統,基於LOTUS的,現在我們用asp.net做了幾個應用模組,需要整合到OA系統中,需要實現一個後來隱藏登入,利用iframe 實現,但是發現,iframe 引用的頁面,直接通過瀏覽器是可以訪問的,但是通過ifame就不可以了。難道是iframe 的問題。於是,我google了一下:“iframe cookie ”,竟然有很多人討論!不久就基本上確認了我當時推測。IE6.0對W3C 關於cookie 的 P3P協議的支援,支援得有些荒唐,幾乎成了bug。有人說,可以設定一下IE的cookie 隱私,就好了,不用對程式做任何改動。但是,總不能要求所有使用者這麼做吧。 再找,呵呵,問題終於解決了 問題原因: 在frameset裡面,也就是裡面的frame是來自第三方網站(不同IP或不同網域名稱),那麼預設情況下IE會自動禁用這些網站的cookie ,也就是在請求某url時在HTTP header裡不發送它們的cookie ,包括session的cookie 。注意,這些網站在response裡面設定的cookie 還是會被發送到瀏覽器的。解決方案:對frame裡面的引用網站的response header裡面添加一個確認資訊,在MSDN裡面有個最簡單的解決辦法:response.addHeader("P3P","CP=CAO PSA OUR")。所有我們可以通過增加一個網站http頭來解決問題;管理工具——〉選擇一個網站——〉屬性——〉http頭,增加一個http頭然後輸入頭名:P3P 輸入頭內容:CP=CAO PSA OUR注意:可以只選擇某一個目錄! 好了,ok了 最後,給出一個msdn的參考:http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q323752 |