使用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