最初发现特定情况下使用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 就可以发现问题,非常直观。