使用CodeIgniter Flexi Auth库,当用户会话到期时,我怎样才能立即将用户重定向到登录页面(并显示一条消息:"您的登录已过期,请再次登录"而不是只发生在页面加载上。
我在想我需要使用JavaScript和定时函数来检查用户是否仍然每隔几秒钟登录一次。但是我怎么能用JavaScript做到这一点?
答案 0 :(得分:0)
会话到期是在服务器上维护的信息。除非您使用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请求或其他服务器端事件可能已对此进行了扩展。我们可以将此减少为仅一个请求,如果在加载页面时,预期的会话到期时间与其一起加载在隐藏的输入字段或其他内容中。当然,还有很多其他代码需要输入错误。