日期:2014-05-17  浏览次数:20598 次

jsp和servlet中的session问题
打开第一个网页,然后登录,用session保存用户名。然后点击登录后网页里一个链接,随后在网页中输出用户名(比如用户名为1,输出的就是1)
再打开一个网页,具体操作步骤如上,打印用户名(2个网页用不同的用户名和密码,假设用户名为2,然后输出2)

但是在我在点击第一个网页中的链接时,问题就来了,它输出的也是2,

我想问一下,我现在打开2个网页,应该是给servlet创建了2个线程,他们应该各自有个session的实例的,为什么第一个网页的session值会被覆盖呢?

难道sessios在整个应用程序阶段,只被创建一次?并且也不是线程安全的吗?

请各位大虾帮忙解释一下!谢谢了



------解决方案--------------------
探讨
我想问一下,我现在打开2个网页,应该是给servlet创建了2个线程,他们应该各自有个session的实例的,为什么第一个网页的session值会被覆盖呢?

------解决方案--------------------
按照个人的理解,session是一个会话发生自动就由服务生成的。每一个会话都只是有一个session,关于这一点可以获取SESSION的ID来验证。在同一个浏览器,无论你打开多少个窗口,服务器都会认为是同一个程序发出的请求,所以共享同一个SESSION,如果你两个窗口都对存储在SESSEION中的同一个变量进行赋值,那么服务器会记录最新的那个,所以会有你刚才的情况发生。如果你用不同的浏览器同时访问同一个服务器,那么SESSION是不同的。如果楼主还不清楚,可以具体去了解一下会话与SESSION的一些机制。
------解决方案--------------------
晕,这个问题是Session的特征嘛,也就是同一套窗口只有一个Session,你往里面放同一个key的value值它当然要覆盖以前值了,当你重新启动另一套窗口,它用的就是另外一个Session了,一个Session的生命周期就是它本身的一套父子窗口的存在时间,如果整套窗口被关闭了,这个Session也就消失了,当然如果你长期不关闭这套窗口,服务器会在一个默认时间段后清除该Session释放内存