iframe中的session失效問題情況描述和解決

 
 
環境描述:A平臺(域名:www.aaa.com)B平臺(zengzhi.bbb.net)A平臺的一個頁面a.jsp嵌套B平臺的一個頁面b.jspA使用iframe,b.jsp上引用了B平臺另外一個image.jspimage.jsp生成一個隨機驗證碼,存入session,生成一個圖片,顯示在b.jsp上。提交b.jsp,到B平臺的Baction.do,發現在Baction中取道的session爲空。
 
 
如果a.jspB平臺應用上,不會出現上述問題。在這種應用中,頁面中的session失效了。
 
網上資料:
其實之所以出現這種情況是我們一般採用IE6作爲瀏覽器(IE7firefox沒有這個問題),而IE6它的安全策略默認是會把iframe中的頁面站點認爲是不可信任的,它會阻止該站點傳過來的cookie(如果你在iframe中的URL跳轉是用的localhost,則不會被阻擋),所以因爲沒法使用cookie了,session便實效了。其實這裏還是有個小問題的,因爲在j2ee中的session是靠cookieurl重寫來維持的,如果cookie不能用了,因該是自動採用url重寫來維持住session,不知爲什麼沒有自動採用後者。
 
 
解決方法一:
      一個是在IE中設置允許iframe中的站點的cookie,在工具-Internet選項-〉安全-〉受信任的站點,將zengzhi.inhe.net,設置爲‘受信任的站點’,這樣,在Baction就可以取得session中的值了,但有一個問題,就是每次訪問a.jsp的時候,IE總會提示‘是否允許該站點’,感覺很煩,爲了順利訪問a.jsp,我們還需要將www.aaa.com設置爲‘受信任的站點’,這樣就可以徹底解決session失效問題。
 
       雖然這種方法可以解決session失效問題,但每個用戶都要設置IE,這樣非常麻煩,也沒有從根本上解決session失效問題。
 
解決方法二:
       a.jsp連接b.jsp時,生成了一個sessionb.jsp引用了image.jsp,我們發現imgae.jsp中的session又是一個新的,和b.jsp中並不是同一個session,在提交b.jsp後,Baction也生成一個新的session,這三個sessionsessionId是不同的。由此可以知道在jsp向下傳的過程中sessionId丟失了。爲了保持同一個session,在地址跳轉時,將sessionId帶上,這樣,在下一個頁面或action中,會取到相同的session
引用image.jsp寫法:
<img src="<%=request.getContextPath()%>/webadmin/js/imagecode2.jsp;jsessionid=<%= session.getId()%>" name=Image1 border=0 >
 
提交地址寫法:
action="<%=request.getContextPath()%>/webadmin/userselfservice/login/login.do;jsessionid=<%=session.getId()%>"
 
這樣到了Baction中,取得的是同一個session,就可以取得隨機驗證碼.
 
 
別以爲這樣就成功了,還存在一個巨大的陷阱。雖然我們從A平臺將session值傳遞到了B平臺,發現在Baction,添加的新的session屬性(如:用戶信息),在Baction之後,B平臺其他的頁面,居然取不到。這是爲何??難道還需要繼續傳遞sessionId不成?的確如此,在以後的頁面我們還需要繼續傳遞sessionId。。。。如此下去,系統將混亂不堪。所以我們不能讓sessionId這樣牽制着我們,我們要消滅它。不錯,在Baction之前,我們不得不使用同一個session,但到了B平臺操作後,我們將和他斷絕關係,這樣我們才能自由。在我們進入Baction後將我們需要的session中的值取出,然後銷燬它,再創建一個新的session
request.getSession().invalidate();
HttpSession newSession = request.getSession(true);
我們將需要的值,設置到newSession中即可。
 
 
比較起來還是使用方法二來解決,這可能是session問題的一種,還存在類似的session失效問題,可以根據方法二和具體環境進行改進。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章