如果用户变为活动状态,则在到期前激活会话

时间:2013-03-12 01:14:26

标签: php user-management login-script

我是一名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/');

#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
}
}
?>

2 个答案:

答案 0 :(得分:1)

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

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

进入包括。

答案 1 :(得分:0)

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

但总结一下这个问题的想法(并实际回答你的问题):

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

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

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

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

  • 在开始输出之前,您应该尝试完成所有准备工作(sesssions,请求处理等)。输出是echoprintdumps<?php ?>标记之外的任何内容。这些都将数据发送到客户端,一旦启动,您就无法在服务器上执行某些操作。这导致了php devs "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