【使用者線上統計】如何處理瀏覽器關閉時候的session清理問題
線上使用者統計是用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();
};