1

我是 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
}
}
?>
4

2 回答 2

1

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

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

包括在内。

于 2013-03-12T01:20:20.693 回答
0

我建议阅读对这个问题的出色回答:如何在 30 分钟后使 PHP 会话过期?

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

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

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

你应该总是die或者exit当你的代码结束时。当您执行重定向时,您已决定当前页面已完成,并且您希望另一个页面接管当前请求。

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

  • 在开始输出之前,您应该尝试完成所有准备工作(会话、请求处理等)。输出是任何echo's 或print's 或's 或标签dumps之外的任何东西。<?php ?>这些都将数据发送到客户端,一旦启动,您就无法在服务器上执行某些操作。这导致 php 开发人员遇到的一个非常常见的问题“标头已发送”
  • 使用服务器端重定向设置适当的HTTP 响应代码。使用 javascript 不会。所有浏览器都支持 HTTP——这就是浏览器——但并非所有浏览器都支持 javascript。此外,即使用户的浏览器支持 javascript,用户也可能在您/未知的网站上完全阻止 javascript。Javascript 是增强网站的好方法,但如果您依赖它来实现关键功能,它可能会导致漏洞,从而影响您的用户甚至您的网站(如果您在 javascript 中放弃了太多网站的内部运作) ,无论您做什么,客户都可以完全访问它...)。不要相信客户。

[ 的文档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 纪元,因此请注意2038 年
于 2013-03-12T02:00:38.193 回答