在线用户统计是用HttpSessionBindingListener实现的,将实例化的类放到session对象中,
request.getSession().setAttribute("onlineUserListener", onlineUserListener);
HttpSessionBindingListener内有两个方法valueBound(HttpSessionBindingEvent event)和valueUnbound(HttpSessionBindingEvent event),前者为数据绑定,后者为取消绑定。在创建和销毁session的时候,分别调用。
问题在于,正常的退出,是可以将session销毁从而进入valueUnbound方法进行逻辑处理的,但是如果直接关闭浏览器,就无法得到session的销毁事件,没有办法进行记录。
最早使用的是window.unonload方法,在页面关闭时候可以在这个方法中调用一个action,在action中将session置为无效。但是这种实现最大的问题是,页面刷新unonload方法一样会调用,会造成session无效的重新登录。
如何能够判断unonload方法的调用是刷新还是关闭,可以分辨何时调用session无效的请求。
利用onbeforeunload ,是在onunload前触发的事件,在全局添加变量,在触发onbeforeunload记录时间,根据时间差来判断是关闭还是刷新。
var _beforeUnload_time = 0, _gap_time = 0;
window.onunload = function (){
_gap_time = new Date().getTime() - _beforeUnload_time;
// console.log(_gap_time);
if(_gap_time <= 5)
page_unload()
};
window.onbeforeunload = function (){
_beforeUnload_time = new Date().getTime();
};