日期:2014-05-19  浏览次数:20883 次

session是什么时候被销毁的?
我在一个servlet中,getSession后并绑定了一个字符串,然后转发到另一jsp并取出显示出来。这一阶段没问题,然后我重新启动了tomcat,这时直接访问jsp页面,奇怪的是竟然也能取到之前绑定的那个字符串!重启服务器后,session不是应该被销毁了么?怎么还可以访问到原先的那个session?!我又试了将数据绑定在ServletContext,然后在jsp中取出,重启tomcat后,如所料的,去取原来绑定的那个数据为null。
这个Session到底是怎么回事?我写了个session监听器,发现第一次访问监听器有反应,之后就算重启了Tomcat也都不再触发到监听器了,就是说不再创建新的Session,浏览器这边的cookie,sessionID也一直是原先那个。
求解释。

------解决方案--------------------
和Tomcat的配置有关系:tomcat/conf/context.xml配置中:
 <!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
 --> 
每次关闭tomcat的时候,都会将当前每个Session中的内容写到文件中,然后重新启动Tomcat的时候读取这个文件,并且验证Session是否超时。。然后,发挥你的想象力吧。 取消注释就ok了。
------解决方案--------------------
有可能浏览器中cookie记录了,你要清cookie
------解决方案--------------------
这个跟session的生命周期有关,当你关闭浏览器后再重启,session将不会是同一个,就不会有你讲述的那个现象了,而楼主讲的那个绑定在servletContext上的情况,当关闭容器组件时,servlet实例已被销毁,servlet已经不复存在了,所以会得到null值。
------解决方案--------------------
我查到的资料希望对楼主有点帮助


要知道session 原理以及生命周期 
1:session 是通过浏览器的cookie来保存一个jessionid的信息 。这个jsessionid里面包含着你session 的id 。正是通过这个jessionid浏览器才能判断是不同用户的session ,用户每次进行session.getAttribute()或则 session.setAttribute时候。都会取出jesseionid里面的信息和session id比较。来区分不通的session。
2.session 的生命周期是一次会话。就是从用户开始请求这个application开始到application结束。 你停止了服务当然这个应用也就结束。tomcate容器出清除session

一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存 到硬盘上。
你可以设置session的持久化特性试试看,当服务器进程重新启动或这些信息将能够被再次使用。
tomcat 正常关闭或者 restart 的话 tomcat 会在 work 的这个工程目录下有个 session.ser 文件,会保存在那里,重启时会重新加载。

默认的Tomcat是支持Session持久化的。当然,取消注释也就取消了这个功能。 
conf/context.xml:
<Manager pathname="" /> .
------解决方案--------------------
session没有销毁是因为当你关闭tomcat的时候,tomcat会默认把当前session序列化到work目录下,生成一个session.ser的文件备份一下,当你再启动的时候,通过读取这个文件在恢复你之前启动时的session状态,所以当你再次访问的时候还有当初你设置的对象。