1. 程式人生 > >iframe,Frame中Session丟失的解決方法

iframe,Frame中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丟失問題就解決了。至於裡面具體的原因 也沒時間去搞懂了。

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

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丟失的問題才徹底解決。

Frame中Session丟失的解決方法