Session的创建和销毁

时间:2022-03-12 13:08:39
session什么时候被创建

一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet )调用
HttpServletRequest.getSession(true)  //false 不会自动创建Session 
这样的语句时才会被创建。 所以没有调用getSession方法则不会创建session

要了解Session首先要知道一个概念:Session的销毁只有两种情况:

第一:session调用了 session.invalidate()方法。
第二:前后两次请求超出了session指定的生命周期时间。

其中Session的生命周期时间可以在web.xml配置。默认30分钟 在web.xml可以做如下配置:
<session-config>
<session-timeout>5</session-timeout>
</session-config>

     如何来证明关闭浏览器的时候Session没有销毁呢?  我们可以创建一个SessionListener 此监听器专门用来监听Session的生命周期的.代码如下:

// 新建一个session时触发此操作  
public void sessionCreated(HttpSessionEvent se) {
System.out.println(se.getSession().getId());
}

// 销毁一个session时触发此操作
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println(se.getSession().getId());
}


   别忘记在web.xml中配置监听器, 配置完毕后 可以做个测试。 当浏览器关闭后此监听器的 sessionDestroyed方法并没有执行,而是在5分钟左右(个人电脑没有那么精确) 才会触发sessionDestroyed ,当然 再打开浏览器的时候 sessionCreated 会自动调用 关闭5分钟后sessionDestroyed 又会自动调用, 通过getID方法大家可以判断是否为同一个Session. 所以网上说明的关闭浏览器Session就消失.其实并不正确。如果没有任何配置的情况下. 关闭浏览器30分钟后Session才会消失的。
   我们可以利用这个概念做什么呢? 最典型的就是利用 SessionListener  的sessionDestroyed方法 来记录用户非正常退出的时间. 用户在访问某个网站的时候(目前的银行网站都有此功能) 显示了用户的最后登录时间. 此时间如何获取. 在这里分两种情况
   如果用户按"退出" 按钮那就好说了. 跳转到action中.记录下用户退出的时间. 存储到持久层中。
   如果用户非正常退出, 在没有配置Session的情况下 默认会在30分钟后调用sessionDestroyed 那么我们同样可以在此获取用户退出的时间,在sessionDestroyed 调用业务逻辑完成我们想要实现的功能。