【问题标题】:Activate session before expiring if user become active如果用户变为活动状态,则在过期之前激活会话
【发布时间】:2013-03-12 01:14:25
【问题描述】:

我是 PHP 初学者。我设法创建了一个用户注册/注册系统,该系统通向仪表板面板。用户使用会话登录。

我制作了一个会话时间脚本,也使会话在 30 分钟后过期。但我的问题是如何使其仅在用户处于非活动状态时才过期,如果用户突然处于活动状态,如何防止它过期。

这是我的登录代码和仪表板代码。请帮帮我。编码帮助将不胜感激。

谢谢

#登录密码

    $_SESSION['username'] = $username;  
    $_SESSION['emailAddress'] = $email;  
    $_SESSION['LoggedIn'] = 1; 
    $_SESSION['start'] = time(); // taking now logged in time
    $_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ; 

   header('Location: ../dashboard/');

#仪表板代码

session_start();



if(empty($_SESSION['LoggedIn']) && empty($_SESSION['username']))  
{  


          echo  "<script>location.href='session-expired.php'</script>";

}
     elseif(!isset($_SESSION['LoggedIn']) && !isset($_SESSION['username']))
{
    echo  "<script>location.href='session-expired.php'</script>";

}
else
{

    $now = time(); 

    if($now > $_SESSION['expire'])
    {
        session_destroy();
         echo  "<script>location.href='session-expired.php'</script>";
    }

    else
    { 


?>

<!-- After all the html codes --!>


<?php
}
}
?>

【问题讨论】:

    标签: php user-management login-script


    【解决方案1】:

    如果用户变得活跃,那么他/她将再次点击一个页面,这就是您想要移动会话到期时间的时候。如果您有所需页面使用的包含文件(例如标题包含),则可以放置这些行

    $_SESSION['start'] = time(); // taking now logged in time
    $_SESSION['expire'] = $_SESSION['start'] + (1 * 10) ;
    

    包含在其中。

    【讨论】:

      【解决方案2】:

      我建议阅读对这个问题的优秀回答:How do I expire a PHP session after 30 minutes?

      但要总结该问题的想法(并实际回答您的问题):

      不要相信 php ini 配置,自动过期不会在每个请求上运行,您也不希望它运行(它会运行在磁盘上的每个会话,而不仅仅是当前会话)。

      不要从开始时间更新$_SESSION['expire'] 值。从当前时间更新。这使它更接近“x 不活动期”的实际行为。

      当您的代码结束时,您应该始终dieexit。执行重定向时,您已决定当前页面已完成,并且您希望其他页面接管当前请求。

      尽量不要使用&lt;script&gt;location.href=&lt;/script&gt; 进行重定向。您应该坚持在登录代码中使用的服务器端重定向,如下所示:header('Location: ../dashboard/');。这有几个原因。

      • 在开始输出之前,您应该尝试完成所有准备工作(会话、请求处理等)。输出是echoprintdumps&lt;?php ?&gt; 标记之外的任何内容。这些都将数据发送到客户端,一旦启动,您就无法在服务器上执行某些操作。这导致了 php 开发人员"headers already sent" 遇到的一个非常常见的问题
      • 使用服务器端重定向设置适当的HTTP response code。使用 javascript 不会。所有浏览器都支持 HTTP——这就是浏览器的本质——但不是所有的browsers support javascript。此外,即使用户的浏览器支持 javascript,用户也可能在您/未知的网站上完全阻止 javascript。 Javascript 是enhance websites 的好方法,但如果你依赖它来实现关键功能,它可能会导致漏洞,从而影响你的用户甚至你的网站(如果你在你的javascript,无论您做什么,客户端都可以完全访问它......)。 Don't trust the client.

      [session_destroy][8] 的文档是这样说的:

      为了完全终止会话,例如注销用户,还必须取消设置会话 ID。如果使用 cookie 传播会话 id(默认行为),则必须删除会话 cookie。 setcookie() 可以用于此。

      他们没有详细说明如何取消设置会话 ID,但它是这样的:

      session_start();
      session_unset();
      session_destroy();
      session_write_close();
      // if using coookies
      setcookie(session_name(),'',0,'/');
      session_regenerate_id(true);
      

      所以我会为你的 # DASHBOARD CODE

      这样做
      session_start();
      if(!isset($_SESSION['LoggedIn']) || empty($_SESSION['LoggedIn']) || !isset($_SESSION['username'] || empty($_SESSION['username']))  
      {             
          header("Location: /session-expired.php");
          exit();
      }
      else
      {
          $now = time();
          if($now > $_SESSION['expire'])
          {
              session_start();
              session_unset();
              session_destroy();
              session_write_close();
              // if using coookies
              setcookie(session_name(),'',0,'/');
              session_regenerate_id(true);
              header("Locaiton: /session-expired.php");
              exit();
          }
          else
          { 
              $_SESSION['expire'] = $now + 10;
          }
      }
      

      另请注意:

      • 您可以将未登录的初始检查汇总在一起,因为它们最初执行相同的操作。
      • 您的会话到期时间为 10 秒。非常低,您可能出于测试目的这样做,但我想我会指出 time() 使用秒数,因为您提到您是 PHP 新手。
      • time() 也处理 Unix 纪元,因此请注意 year 2038

      【讨论】:

      • 哇,谢谢帕特里克。解释太好了。是的,我将它设置为 10 秒进行测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2012-02-25
      • 2020-06-06
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多