在Codeigniter中自动过期会话并检测会话是否已过期


Expire session automatically and detect if the session has expired in Codeigniter

我在这里看到了很多关于我的话题的问题,但似乎我还没有找到我的答案。我实际寻找的是,当会话到期时,用户将自动重定向到一个页面,上面写着Your session has already expired. Please register to continue browsing.

实际上我不知道如何确定用户的会话是否已经过期。以下是我目前所掌握的信息。

谢谢。

function trial() {
    $this->db->select()->from('user')->where('user_type', 'tester');
    $tester = $this->db->get();
    foreach ($tester->result() as $row) {
        $data = array(
            'id' => $row->id,
            'first_name' => $row->first_name,
            'last_name' => $row->last_name,
            'display_name' => $row->display_name,
            'email' => $row->email,
            'avatar' => $row->avatar,
            'user_type' => $row->user_type,
            'logged_in' => TRUE
        );
        $this->session->set_userdata($data);
    }
    redirect(base_url(), 'refresh');
} 

可以通过ajax调用检查用户会话,并将其封装到setInterval jquery's函数中,如

setInterval(function() {
  // Do something every 1 minute 
$.ajax({
type : 'POST',
url  : '<?php echo site_url("CONTROLLERNAME/check_session")?>'
success : function(data){
if(data){
   //your session is not expired
}else{
   //your session is already expired
 window.location.href="your url"; // or you can redirect from here also
} 
});
}, 60000);

 //This function checks your session 
 function check_session(){
    $id = $this->session->userdata('id');
   if($id ){
         echo 1;
   }else{
         echo 0;
   redirect('your register controller');//redirect from here or you can redirect in the ajax response
   }
  die();
 }

希望有意义

您可以在会话对象和用户重定向任何页面中存储数据,您可以检查会话对象是否存在,如果不存在,您可以显示警告,会话已过期

虽然不是100%可靠,但您可以在用户机器上设置cookie。我建议你把过期时间提前一小时。

对于您想知道会话是否过期的每个页面,您可以检查cookie和会话是否存在。如果有的话,继续。如果只剩下cookie,那么您就知道会话已经过期,您需要将它们重定向到您在问题中提到的页面。如果两者都不存在,则存在问题,用户需要重新启动一切。

当然,对于实例化会话的每个页面,会话到期将重新启动,因此您需要重置cookie。这可能有点乏味,但这是我推荐的。

当您开始会话时,将当前时间存储在会话变量中。您可以使用session_expire_checker函数,它将检查当前时间和存储时间,以确定会话是否已过期。您应该从构造函数中调用该函数,以便每个函数调用都将自动使用该函数。在该函数中,如果会话过期,则重定向到另一个控制器。

你必须为重定向的URL使用单独的控制器,否则会有无限重定向

Codeigniter在会话过期时不"触发事件"。因此,要么在每个控制器函数中编写一些代码来检查用户是否仍在登录。或者你在页脚使用一些小js(我个人更喜欢):

<script>
    var mins = 15 * 60;
    var active = setTimeout("logout()",(mins*1000));
    function logout()
    {
        location='/account/timeout'; // <-- put your controller function here to destroy the session object and redirect the user to the login page.
    }
</script>