最初發現特定情況下使用frame會導致生成多個session是很久以前的事了,今天突然想起來覺得有必要做個總結,畢竟這種情況還是比較隱蔽的,那麼什麼時候使用frame會產生多個session呢,產生多個session後又會產生什麼樣的麻煩呢?隱蔽在哪裏呢?
1.什麼時候使用frame會產生多個session
不管是frameset還是iframe,只要frame所在文件是htm或html的時候,即靜態網頁時就會產生多個session,至於幾個session和frame的個數是相等的。使用jsp就不會產生多個session。
2.產生多個session後又會產生什麼樣的麻煩呢?
帶來的麻煩是不預期的,比如在其中一個frame中向session中存放了對象,但是在另一個frame中是拿不到這個對象的,因爲不是一個session。
3.隱蔽在哪裏呢?
雖然一次產生了多個session,但是無論那個frame頁面進行刷新都只會使用最後一個session,所以對程序員來說很難發現。
最後,如何來證明上面的事實呢,我寫了一段驗證代碼。
// left.jsp
sessionId:<%=session.getId()%>
<%session.setAttribute("test","test");%>
// right.jsp
sessionId:<%=session.getId()%>
attribute:<%=session.getAttribute("test")%>
// frameset.htm和frameset.jsp相同
<html>
<head>
<title></title>
</head>
<frameset rows="*" cols="400,*" >
<frame src="left.jsp" />
<frame src="right.jsp"/>
</frameset>
</html>
// ifameTest.htm和ifameTest.jsp相同
<html>
<head>
<title></title>
</head>
<body>
<iframe src="left.jsp" height="200" width="300"></iframe>
<iframe src="right.jsp" height="200" width="300"></iframe>
</body>
</html>
發佈到tomcat上,分別訪問下面4個文件即可,注意每次測試過一種情況後要重啓瀏覽器。 ifameTest.htm ifameTest.jsp frameset.htm frameset.jsp
注意觀察比較session id 就可以發現問題,非常直觀。