1

我有这个问题,或者我不知道它是如何工作的概念,我已经使用记住功能进行了登录。如果用户检查它,我会保存在 cookie 中,所以当他再次进入网页时,可以直接访问主页面而不是再次登录。问题是当用户正常登录时,我会在会话中保存一些信息,但是什么当用户有remmber的cookie并没有登录网站直接进入时会发生什么?我丢失了该会话信息..我必须做什么?

我希望你不理解评论,我解释得更好,谢谢你的时间!

4

1 回答 1

0

我假设您在会话中存储的信息是与用户相关的数据,而这些数据又从某处的数据库中提取出来?如果是这种情况,那么我推荐的解决方案是:

当用户选择记住我选项时,您设置的 cookie 需要包含一个值,该值允许您在数据库中再次找到同一用户,以便您可以像找到该用户时一样实例化他们的会话通过他们在登录时提供的凭据。很诱人(但不安全),以简单的方式执行此操作并简单地为您的用户信息存储唯一的数据库 ID,但不要这样做!

相反,创建一个名为会话的表,其中包含三列:user_id、session_id、expire_time。当您的用户登录时,将“记住我”位设置为 true,您将存储他们的用户 ID、会话 ID(可通过调用 session_id() 函数获得)以及您想要的时间“记住”会话到期。

当用户登录并将他们的数据添加到会话中时,您可以调用类似于以下的函数:

<?php
   function persist_session(){
     $user_id     = $_SESSION['user']->id;
     $session_id  = session_id();
     $expire_time = time() + (60 * 60) * 24; // 24 hours
     $sql         = "INSERT INTO sessions (user_id, session_id, expire_time), VALUES ($user_id, $session_id, $expire_time)";
     mysqli_query($sql); // This assuming you've already set up your DB connection and so on
     $_COOKIE['session_id'] = $session_id; // Write the persisted session ID to a cookie
   }
?>

这不是一个非常完整的例子。一方面,您需要编写一些代码来确保没有用户一次将多个会话持久化到表中,但这很容易......

保存会话信息并将其写入 cookie 以供以后参考后,从 cookie 中取回用户信息非常简单:

<?php
    function reinstantiate_session(){
      if(isset($_COOKIE['session_id')){
        $session_info = mysqli_fetch_object(mysqli_query("SELECT * FROM sessions WHERE session_id = '{$_COOKIE[session_id]}'")); 
        if($session_info){
          $_SESSION['user_id'] = $session_info->user_id;
        }
      }
    }
?>

同样,这个例子并不像它可能的那样完整......您需要处理错误,特别是,您可能需要更新您的查找 sql 以排除过期信息,但这应该足以获得你开始了!

于 2013-02-27T22:29:35.720 回答