2013-05-30 156 views
5

我在这里看到很多关于我的话题的问题,但似乎我还没有找到我的答案。我实际上在寻找的是当会话过期时,用户将被自动重定向到一个说的页面。自动过期会话并检测会话是否在Codeigniter中过期

其实我不知道如何确定用户的会话是否已经过期。这是迄今为止我所拥有的。

谢谢。

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'); 
} 

回答

1

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

1

虽然不是100%可靠,但可以在用户机器上设置一个cookie。我会建议提前约一个小时设定到期日。

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

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

+0

有没有办法让我来做在控制器中? –

6

您可以通过使ajax调用来检查用户的会话,并将其包装到setIntervaljquery'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(); 
} 

希望这是有道理的

+0

这是一项上帝的技术,但如果用户关闭了JavaScript,该怎么办?我需要一个无JavaScript脚本的解决方案。 – Smith

+0

我知道这个话题已经很老了,但是会像其他人一样受益,我用上面的答案做了小小的修改。如果你不想使用'js',你可以像这样使用元数据,' />',这是我在其他网站上看到的。将其放在''标签内。 'content =“900;'是以秒为单位的时间,后面跟着'url = <?php echo base_url(”logout“);?>',其中包含注销方法,在我的情况下是单独的控制器。别人在未来,但上面的'.ajax'是我的。谢谢 – Markmeplease

+0

@Markmeplease'content =“900; url = <?php echo base_url(“logout”); '''900'号码是几毫秒还是几秒? – Gagantous

0

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

您必须为重定向的URL使用单独的控制器,否则会出现无限重定向。

0

笨不“触发事件”的时候,会话到期。所以要么在每个控制器函数中编写一些代码来检查用户是否仍然登录。或者您在页脚中使用一些小的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>