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

解决方案 »

  1.   

    和Tomcat的配置有关系:tomcat/conf/context.xml配置中:
     <!-- Uncomment this to disable session persistence across Tomcat restarts -->    
    <!--  
    <Manager pathname="" />  
     --> 
    每次关闭tomcat的时候,都会将当前每个Session中的内容写到文件中,然后重新启动Tomcat的时候读取这个文件,并且验证Session是否超时。。然后,发挥你的想象力吧。 取消注释就ok了。
      

  2.   

    有可能浏览器中cookie记录了,你要清cookie
      

  3.   

    这个跟session的生命周期有关,当你关闭浏览器后再重启,session将不会是同一个,就不会有你讲述的那个现象了,而楼主讲的那个绑定在servletContext上的情况,当关闭容器组件时,servlet实例已被销毁,servlet已经不复存在了,所以会得到null值。
      

  4.   

    对啊,servletContext是没问题,关键是Session为什么在重启tomcat的情况下还没有销毁,使用原先的sessionID还能找到?
      

  5.   

    我查到的资料希望对楼主有点帮助
    要知道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="" />  .
      

  6.   

    session没有销毁是因为当你关闭tomcat的时候,tomcat会默认把当前session序列化到work目录下,生成一个session.ser的文件备份一下,当你再启动的时候,通过读取这个文件在恢复你之前启动时的session状态,所以当你再次访问的时候还有当初你设置的对象。