【问题标题】:Expire session automatically and detect if the session has expired in Codeigniter自动过期会话并在 Codeigniter 中检测会话是否已过期
【发布时间】:2013-05-25 11:41:48
【问题描述】:

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

【问题讨论】:

    标签: php codeigniter session trial


    【解决方案1】:

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

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

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

    【讨论】:

    • 无论如何我可以在控制器中进行操作吗?
    【解决方案2】:

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

    希望有意义

    【讨论】:

    • 这是一项神技术,但如果用户关闭了 JavaScript 会怎样?我需要一个无需 javascript 的解决方案
    • 我知道这个话题已经很老了,但是,它将使像我这样的其他人受益,我使用上面的答案并稍作修改。如果您不想使用js,您可以使用我在其他网站上看到的&lt;meta http-equiv="refresh" content="900;url=&lt;?php echo base_url("logout"); ?&gt;" /&gt; 这样的元数据。将其放在&lt;head&gt;&lt;/head&gt; 标记内。 content="900; 是以秒为单位的时间,然后是 url=&lt;?php echo base_url("logout");?&gt;,其中包含注销方法,在我的情况下,是单独的控制器。希望这对将来的其他人有所帮助,但上面的.ajax 是适合我的。谢谢
    • @Gagantous, IF ELSE 语句测试$id 是否有数据或为真,否则$id 为0 或假,如果$id = 0 or false 表示session 已过期,因此没有数据,因为它已经过期了。因此,ELSE 会将您重定向到登录页面,因为会话已经过期。您可以在登录页面中添加一个条件,该条件将显示通知,例如localhost/login?expired=1。你可以$_GET['expired'] = 1,显示Session Expired, Login again.,或者你可以做jquery来显示通知,然后在点击OK按钮后重定向到登录页面。
    • @Gagantous 在上面的答案中,setInterval(...) 将每 1 分钟检查一次function check_session()。您可以将 setInterval(...) 放在页脚中,function check_session 可以放在另一个视图中,然后您可以将该视图加载到您想要的控制器中,例如 url : '&lt;?php echo site_url("CONTROLLERNAME/check_session")?&gt;'
    • @Gagantous 这是我的footer.php - 查看function checkLogin() { $.ajax({ type : 'POST', url : js_base_url('checkLogin'), success : function(data){ if(data = 0){ if(!alert("Your session has timeout. You will be logout automatically. Login again to continue. Thank you!")){ var l = "&lt;?php echo base_url('login/authentication?logout=1'); ?&gt;"; window.location.href=l; }}}}); } 这是我的CheckLogin.php - 控制器function index(){ $usr = $this-&gt;session-&gt;userdata('s_data'); if($usr){ echo $data = '1'; }else{ echo $data = '0'; }}} 我希望对你有所帮助。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        会话到期时,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>
        

        【讨论】:

          猜你喜欢
          • 2013-04-04
          • 1970-01-01
          • 1970-01-01
          • 2017-05-01
          • 2015-03-22
          • 1970-01-01
          • 1970-01-01
          • 2016-08-04
          • 1970-01-01
          相关资源
          最近更新 更多