Session 字面含义会话,代表了客户端与服务端的“会话”,Session的作用时间从用户第一次到达某个特定的Web页开始,到该用户离开Web站点,或在程序中利用代码终止某个Session。
网上有一种说法:关闭浏览器Session会自动销毁,这种说法是错误的。
Session的销毁只有两种情况:第一 调用了 session.invalidate()方法;第二 Session过期。其中Session的生命周期时间可以在web.xml配置,默认为30分钟,在web.xml配置:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
Java中可使用如下方式监听Session的创建和销毁:
/**
* 实现HttpSessionListener接口监听 监听session的创建事件
*/
@Override
public void sessionCreated(HttpSessionEvent se)
{
String sessionId = se.getSession().getId();
log.info("创建session sessionId= " + sessionId);
}
/**
* 实现HttpSessionListener接口监听 监听session的销毁事件
*/
@Override
public void sessionDestroyed(HttpSessionEvent se)
{
String sessionId = se.getSession().getId();
log.info("销毁session sessionId= " + sessionId);
}
实际上服务端每次为客户端的一次会话建立的Session都含有一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。当直接关闭浏览器时,这个SessionId依旧是存在与服务端,只不过再也没有客户端会携带它然后交予服务端校验。此SessionId已经失去了它存在的价值,会等待Session过期或者程序强制销毁,然后结束自己的年华。
如何在关闭浏览器时调用Session的invalidate()方法,进而可以使用sessionDestroyed()方法来监听Session被销毁的操作。此处提供一种思路,当然这个是有应用局限性的,可以借助于jQuery unload事件。
当用户离开页面时,会发生 unload 事件。
具体来说,当发生以下情况时,会发出 unload 事件:
- 点击某个离开页面的链接
- 在地址栏中键入了新的 URL
- 使用前进或后退按钮
- 关闭浏览器
- 重新加载页面
$(window).unload(function() {
$("#userClose").attr("action", "close.do").submit();
});
然后在close.do中调用this.getSession().invalidate()即可在每次关闭浏览器的时候销毁当前session。