使用CodeIgniter Flexi Auth庫,當用戶會話過期時,如何立即將用戶重定向到頁面登錄(並顯示消息「您的登錄已過期,請再次登錄「),而不是僅在頁面加載時發生。CodeIgniter Flexi Auth - 在登錄過期時立即重定向用戶
我在想,我將需要用戶JavaScript和定時函數來檢查用戶是否仍然每隔幾秒鐘就登錄一次。但我怎樣才能使用JavaScript?
使用CodeIgniter Flexi Auth庫,當用戶會話過期時,如何立即將用戶重定向到頁面登錄(並顯示消息「您的登錄已過期,請再次登錄「),而不是僅在頁面加載時發生。CodeIgniter Flexi Auth - 在登錄過期時立即重定向用戶
我在想,我將需要用戶JavaScript和定時函數來檢查用戶是否仍然每隔幾秒鐘就登錄一次。但我怎樣才能使用JavaScript?
會話過期是在服務器上維護的信息。除非您使用Server-sent events,否則啓動重定向的唯一方法是通過客戶端操作。
如果您正在使用jQuery,並想設置您所描述的系統,那麼你可以設置一個循環來ping服務器如下:
var ping_timeout = 120000; // 2 Minute interval
function checkSession() {
$.get('/session/check/URL?t=' + Math.random(), {}, function(response) {
// ... interpret the server response
if (session_active) { // Still active so check again later
setTimeout(checkSession, ping_timeout);
}
else {
window.location = '/login/url';
}
});
}
setTimeout(checkSession, ping_timeout);
的t
參數被設置爲隨機值以避免瀏覽器緩存響應。
這個方案的一個問題是,你的服務器將被每個用戶按ping_timeout
毫秒的這些請求命中。意識到服務器知道會話何時會過期,我們可以修改邏輯,以便服務器可以告訴客戶端在服務器認爲會話過期時再次檢查,而不是簡單地回答true
或false
。
實現此操作只需更改邏輯,以便服務器以毫秒數進行響應,直至到期。然後,內部函數將是這樣的:現在
function processResponse(response) {
var session_expiry = parseInt(response);
if (session_expiry > 0) {
setTimeout(checkSession, session_expiry);
}
else {
window.location = '/login/url';
}
}
,在理想情況下,就只能是每個會話中,兩個AJAX請求:
因爲不同的AJAX請求或其他服務器端事件可能有前綴,所以我們在更新會話之前進行檢查這取決於你的應用邏輯。我們可以將其減少爲只有一個請求,如果加載頁面時,期望的會話到期時間會隨同它一起加載到隱藏的輸入字段或其他內容中。當然,還有很多其他代碼需要輸入錯誤。
您使用的CI版本是什麼? – Shina 2015-03-07 16:11:21