今天搞的一個登入頁面,被別的網站用iframe嵌進去後,死活無法登入(只在IE中存在這種情況)。
很明顯,session無法被儲存。但是直接在地址欄開啟那個登入頁面,一切都正常啊。真是奇怪啊。
在網上搜尋了一下。發現這個問題還真有不少人提及到。最後的解決方案是在那個登入頁面裡加上以下代碼:
複製代碼 代碼如下:
<span style="font-family:Microsoft YaHei; font-size:14px">header('P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"');
session_start();</span>
可能這個問題跟我的登入頁面是採用javascript的location跳轉也有關。但沒有深入測試研究。
以下是拓展閱讀:
---------------------------------------------
今天在處理騰訊朋友應用的時候,測試給我發來個工單,說應用在IE7 上無法使用.出現登陸逾時錯誤.
第一反應是session丟失了.
於是上網找了下 IE7 iframe session丟失問題.後來找到如下文章,問題解決:
=============================================
昨天,我在校內上做的時間日記終於上線了。上線第一天有80多個使用者安裝,但卻以外收到不少使用者的反饋說應用不可用。我之前都是在firefox上開發的(估計校內工作人員也是用firefox審核的),在使用IE7測試時,卻發現首頁之外的頁面全都無法正常開啟。
在網上尋找了許多資料,發現在IE7中存在這樣的問題:如果頁面中存在著一個或多個iframe的子頁面,那麼在子頁面中建立session可能無 法成功,這樣session資料就無法和其他頁面所共用。在開發校內、51應用時,假設採用iframe方式,很可能會遇到這樣的問題。而且這個問題只存 在於IE7瀏覽器中,我在firefox, IE6和chrome等瀏覽器中測試均沒有問題。
解決方案是:在運行session_start之前,在程式中加上如下一句(以php語言為例),大致是向瀏覽器聲明一下安全層級,這樣iframe子頁面在建立session時就不會有問題了:
header('P3P: CP=”ALL ADM DEV PSAi COM OUR OTRo STP IND ONL”‘);
另外,我還瞭解到:如果次層網域中包含了底線,如:your_domain.yourhost.com,在建立和傳遞session時也可能會出現問題。
一點感想:
1)時隔多年,瀏覽器安全色性問題仍然沒有得到徹底解決,IE瀏覽器仍然是那麼讓開發人員感到痛苦和折磨。
2)發布應用前,一定要經過嚴密的瀏覽器安全色性測試,否則就有可能損失應用的第一批使用者。
==============================================
其他參考文章:
==============================================
解決iframe中jsessionid無法傳遞導致session丟失的問題
http://618119.com/archives/2007/12/19/48.html
在實現 ISMP2.1.1 介面的適合需要用到sso,而ISMP裡定義的介面是需要在iframe等嵌入頁面中調用sso介面,在實際開發中發現session無法正常傳遞。
重現問題的情境是:
1.先訪問a網站:http://192.168.18.2/test.jsp
test.jsp的代碼為:
複製代碼 代碼如下:
<html>
<head>
<title> 618119.com </title>
</head>
<body>
<iframe src=”http://192.168.18.3/sso.jsp?ssoinfo=xxxx “>
</iframe>
</body>
</html>
sso .jsp裡讀取傳遞的ssoinfo,反向調用ISMP認證介面,
產生session,然後放入指定的屬性值,
session .setAttribute(“ssoUser”,”lizongbo”);
頁面再重新導向到 http://192.168.18.3/iframe.jsp
response.sendRedirect(“/iframe.jsp”);
iframe.jsp中讀取session中ssoUser的屬性值,會發現無法讀取。
2.如果先訪問了 192.168.18.3的頁面,再訪問192.168.18.2的頁面,此時的iframe嵌入是可以傳遞已產生好的jsessionid Cookie.
因此解決的辦法有:
a.在url中加上jsessionid.
例如重新導向到 response.sendRedirect(“/iframe.jsp;jsessionid =lizongbo”);
而這種情況下,如果iframe.jsp頁面內的其它串連的url沒有加上jsessionid,
也無法繼續傳遞session,不過通過在用戶端的js來為每個超串連的href屬性重寫加上jsessionid.
b.sso.jsp裡設定P3P頭資訊
例如 P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”
或 P3P:CP=”CAO PSA OUR”
java代碼為:
response.addHeader(“P3P”,”/”CAO PSA OUR/”");