CodeIgniter Flexi Auth - 在登录过期时立即重定向用户

时间:2015-02-11 02:26:42

标签: javascript php codeigniter authentication

使用CodeIgniter Flexi Auth库,当用户会话到期时,我怎样才能立即将用户重定向到登录页面(并显示一条消息:"您的登录已过期,请再次登录"而不是只发生在页面加载上。

我在想我需要使用JavaScript和定时函数来检查用户是否仍然每隔几秒钟登录一次。但是我怎么能用JavaScript做到这一点?

1 个答案:

答案 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毫秒就会遇到这些请求。意识到服务器知道会话何时到期,我们可以修改逻辑,这样服务器就可以告诉客户端在服务器认为时再次检查,而不是简单地回答truefalse。会话将过期。

实现这一点只需要更改逻辑,以便服务器以毫秒数响应,直到到期。内部函数将类似于:

function processResponse(response) {
    var session_expiry = parseInt(response);
    if (session_expiry > 0) {
        setTimeout(checkSession, session_expiry);
    }
    else {
        window.location = '/login/url';
    }
}

现在,在理想情况下,每个会话只会有两个AJAX请求:

  1. 获得到期时间
  2. 检查会话是否真的过期,然后让用户再次登录
  3. 我们在更新会话之前进行检查,因为根据您的应用程序逻辑,不同的AJAX请求或其他服务器端事件可能已对此进行了扩展。我们可以将此减少为仅一个请求,如果在加载页面时,预期的会话到期时间与其一起加载在隐藏的输入字段或其他内容中。当然,还有很多其他代码需要输入错误。