程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> IE下PHP iframe跨域導致session丟失問題的解決方法

IE下PHP iframe跨域導致session丟失問題的解決方法

編輯:關於PHP編程

一個登錄頁面,被別的網站用iframe嵌進去後,死活無法登錄(只在IE中存在這種情況)。主要是session無法被保存的問題,下面把個人的解決過程分享個大家 今天搞的一個登錄頁面,被別的網站用iframe嵌進去後,死活無法登錄(只在IE中存在這種情況)。 

很明顯,session無法被保存。但是直接在地址欄打開那個登錄頁面,一切都正常啊。真是奇怪啊。 

在網上搜索了一下。發現這個問題還真有不少人提及到。最後的解決方法是在那個登錄頁面裡加上以下代碼: 
代碼如下:

header('P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"'); 
session_start();

 
可能這個問題跟我的登錄頁面是采用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>session--www.jbxue.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/”");

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved