2013-03-12 76 views
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/'); 

#仪表板CODE

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

回答

0

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

但是总结一下这个问题的意见(实际上回答你的问题):

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

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

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

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

  • 在开始放置输出之前,您应该尝试完成所有准备工作(sesssions,请求处理等)。输出是echoprintdumps<?php ?>标记之外的任何内容。这些都将数据发送到客户端,一旦启动,您无法在服务器上执行某些操作。这导致了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传播会话标识(默认行为),则必须删除会话cookie。 setcookie()可用于此目的。

他们帮倒忙没有详细介绍如何取消设置会话ID,但它是这样的:

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

所以,我会为你#仪表板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
+0

哇,谢谢你PatricK。解释非常好。 是的,我把它设置为10秒进行测试。 – 2013-03-12 04:22:26

1

如果用户被激活,那么他/她将再度创出页面,那就是当你想要移动会话到期时间。如果您的包含文件是由所需的页面使用的(例如包含标题),则可以将这些行放入这些包含的行中。

+0

谢谢,这有很大的帮助。 – 2013-03-12 01:21:49

+0

不客气。如果解决了这个问题,请您将答案标记为已接受? – 2013-03-12 01:23:01

+0

是的,工作..谢谢你... – 2013-03-12 01:27:56