IFrame中Session丟失的解決辦法

N層IFrame 框架集
單獨測試都是沒有問題的,結果再次嵌套問題就來了,登錄以後,碰到每個頁面檢查登錄時,SESSION就丟掉了,百思不得其解。百度一下,找到解決方案:
在開發中,我們經常會遇到使用Frame來工作,而且有時是爲了跟其他網站集成,應用到多域的情況下,而Iframe是不能保存Session的。因此,網上可以找到很多相關的文章,如果網站可以採用設置Web.Config中的配置:<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" 
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="40" 
/> 
把cookieless="false"改成"true"就可以了。但也同樣有個小問題,就是如果頁面中採用Javascript的window.location.href=''這樣的方式來重定向的話,系統會認爲這是另一個新的請求,產生一個新的SessionId,導致原Session同樣的丟失。所以對於重定向,還是使用Response.Redirect()爲好。


除了Ifrmae有丟Session問題外,frameset也有同樣的問題。Frameset的問題更不移定,是有時會丟,有時不會丟,這更認人頭痛,在網上找到了一個方法,在頁面page_onload裏添加一語句: 
Response.AddHeader("P3P","CP=CAO PSA OUR"); 
FrameSet中的Session丟失問題就解決了。至於裏面具體的原因 也沒時間去搞懂了。


-----------------------------------------------------------------------------------------------------------------------------------------------


在實際操作中,以上設置將導致對方post過來的數據我方接收不到的問題,正確的解決方法應該是:


http://www.cnblogs.com/suxvsheng/archive/2007/08/17/860157.html


IE框架中訪問不同域的網頁不能帶入COOKIE————是IE瀏覽器的一個BUG? 
偶然中發現一個IE瀏覽器的問題: 
站點aa.com的頁面a.aspx中存在一個iframe,iframe的src爲站點bb.com的b.aspx。b.aspx設置了一個COOKIE(不管臨時保存還是長期保存),然後刷新aa.com/a.aspx,bb.com/b.aspx也會被刷新,這時候會發現第二次向bb.com/b.aspx的請求裏面並沒有帶入第一次設置的COOKIE。 
更確切地說:IE瀏覽器丟掉了框架中不同域的COOKIE。


查看瀏覽器的隱私選項,默認是“中”。現在把隱私的等級修改成“低”,再次做上面的測試,然後發現框架中的COOKIE可以被帶入了。 
從這個現象來看,應該是IE出於安全考慮而做了限制。但是!!!處於不同的兩個域的的頁面,應該被看成打開了兩個互不相關的瀏覽器窗口,大家各自設置自己的COOKIE,各自帶入到下次請求中,只要互不影響,不應該受到限制。 
恩,那麼,爲什麼要限制呢?看來還是微軟的程序員對自己瀏覽器的安全沒什麼信心,擔心同一瀏覽器窗口不同域的情況下,黑客仍可能獲取另一域的COOKIE,所以乾脆把其中一個域的COOKIE幹掉!!!人家FireFox爲什麼就沒這種限制?


===========================================================================




問題根源:


IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)協議默認阻止第三方無隱私安全聲明的cookie,Firefox目前還不支持P3P安全特性,firefox中自然也不存在此問題了。Mircosoft對此的具體描述可以參見 Privacy in Internet Explorer 6


解決方法:


很簡單,在要嵌入的內容中(iframe指向的站點)輸出P3P的主機頭聲明,步驟如下(Session variables are lost if you use FRAMESET in Internet Explorer 6):


1.打開IIS管理器 inetmgr 
2.選擇被嵌入iframe源站點或者目錄,右鍵點擊打開屬性框 
3.切換到HTTP頭 
4.添加 
5.自定義HTTP頭名: P3P 
6.自定義HTTP頭值: CP="CAO PSA OUR" 
7.關閉屬性框退出,即刻生效 
至於上面CAO PSA OUR的具體意思,還是請參考前面的文章:Privacy in Internet Explorer 6


至此,iframe框架下session丟失的問題才徹底解決。


但是,接受了所有的第三方的cookie會導致服務器安全性能降低,所以,暫時使用該方法,以後再摸索更好的解決方案
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章