我會在客戶端處理這個問題。創建一個對象來封裝功能。
喜歡的東西:
var UserInactivityMonitor = UserInactivityMonitor || {};
UserInactivityMonitor = (function (module) {
var inactivityIndex;
var promptIndex;
var timer;
module.startInactivityMonitor = function() {
module.timerTick();
};
module.timerTick = function() {
inactivityIndex--;
if (inactivityIndex === 0) {
module.fireInactivityAlert();
}
if (inactivityIndex === promptIndex) {
module.fireIdlePrompt();
}
timer = setTimeout(module.timerTick, 1000);
};
module.fireIdlePrompt = function() {
var response = confirm('are you stil there?');
if (response === true) {
module.resetInactivityIndex();
}
};
module.resetInactivityIndex = function() {
inactivityIndex = 15;
promptIndex = 5;
};
module.fireInactivityAlert = function() {
alert('Inactivity alert!');
};
module.initialize = function() {
module.resetInactivityIndex();
module.startInactivityMonitor();
};
return module;
})(UserInactivityMonitor || {});
設置inactivityIndex到將不活動的事件觸發之前經過的秒數。將promptIndex設置爲當用戶提示他們仍然存在時的剩餘秒數。上面的代碼將不活動超時設置爲15秒,並在剩餘5秒時調用空閒提示。
在頁面加載啓動閒置計時器:
$(function() {
UserInactivityMonitor.initialize();
});
在任何AJAX請求,計數器復位:
$("#fooButton").on('click', function() {
$.ajax(
{
url: $("#buttonClickPostUrl").val(),
data: {
someData: 'data'
},
type: 'POST',
complete: function() {
UserInactivityMonitor.resetInactivityIndex();
}
});
});
如果服務器正在維護會話狀態,那麼你將要作出的請求返回到服務器以終止會話,並可選擇將瀏覽器引導至事件的適當頁面。您可以在fireInactivityAlert()函數中執行此操作。
我可能會錯過一些東西,但我認爲你可以在沒有動作過濾器的情況下做到這一點。我猜想計時器會在每個視圖渲染時重置(如果登錄),在15分鐘後觸發,然後在他們回答後重置。如果是這樣,我可以考慮一個相當簡單的設計。 – 2013-02-09 05:19:14
很好的問題! – 2013-02-09 05:41:02