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

6

我在这里看到很多关于我的主题的问题,但似乎我仍然没有找到答案。实际上我想要的是,在会话过期后,用户将被自动重定向到一个页面,显示“您的会话已经过期,请注册以继续浏览。”

实际上我不知道如何确定用户的会话是否已经过期。以下是我目前拥有的内容。

谢谢。

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');
} 
5个回答

6
您可以通过将ajax调用包装到setIntervalJQuery函数中来检查用户的会话。
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就能工作的解决方案。 - Smith
@Markmeplease content="900;url=<?php echo base_url("logout"); ?>,这里的900数字是以毫秒还是秒为单位? - Gagantous
1
@Gagantous,该IF ELSE语句测试$id是否有数据或为真,否则$id为0或假,如果$id = 0或false,则意味着session已过期,因此没有数据,因为它已经过期。因此,ELSE将重定向您到登录页面,因为会话已过期。您可以在登录页面中添加一个条件,显示通知,例如localhost/login?expired=1。您可以将$_GET['expired']设置为1,显示“会话已过期,请重新登录。”或者您可以使用jquery来显示通知,然后在单击OK按钮后重定向到登录页面。 - Markmeplease
1
@Gagantous 在上面的答案中,setInterval(...) 将每隔 1 分钟检查一次 function check_session()。您可以将 setInterval(...) 放在页脚中,function check_session 可以放在另一个视图中,然后您可以在想要的控制器中加载该视图,例如 url: '<?php echo site_url("CONTROLLERNAME/check_session")?>' - Markmeplease
1
@Gagantous 这是我的footer.php - 查看 function checkLogin() { $.ajax({ type : 'POST', url : js_base_url('checkLogin'), success : function(data){ if(data = 0){ if(!alert("您的会话已超时。您将自动注销。请重新登录以继续。谢谢!")){ var l = "<?php echo base_url('login/authentication?logout=1'); ?>"; window.location.href=l; }}}}); } 这是我的CheckLogin.php - 控制器 function index(){ $usr = $this->session->userdata('s_data'); if($usr){ echo $data = '1'; }else{ echo $data = '0'; }}} 希望这能帮到您。 - Markmeplease
显示剩余5条评论

1
尽管不是100%可靠,您可以在用户计算机上设置cookie。我建议将到期时间提前一个小时左右。
每个需要知道会话是否过期的页面都可以检查cookie和会话是否存在。如果两者都存在,则继续。如果只剩下cookie,则您知道会话已过期,并且需要将其重定向到问题中引用的页面。如果两者都不存在,则存在问题,用户需要重新启动所有内容。
当然,对于每个实例化会话的页面,会话到期都会重新开始,因此您需要重置cookie。这可能有点繁琐,但这是我建议的方法。

有没有办法在控制器中完成它? - AyJane Bouvier

1

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


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>

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接