5

我在这里看到了很多关于我的主题的问题,但似乎我还没有找到答案。我真正在寻找的是当会话到期时,用户将被自动重定向到一个页面,上面写着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');
} 
4

5 回答 5

6

您可以通过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();
 }

希望有意义

于 2013-05-30T06:22:19.070 回答
1

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

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

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

于 2013-05-30T02:35:39.753 回答
1

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

于 2013-05-30T06:53:51.240 回答
0

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

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

于 2013-05-30T06:37:03.383 回答
0

会话到期时,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>
于 2016-08-29T08:19:13.420 回答