【问题标题】:Can I log user out after session has reached maxlife会话达到 maxlife 后我可以注销用户吗
【发布时间】:2012-09-18 09:05:34
【问题描述】:

我在下面有一段代码,其中会话变量可以持续 12 小时:

ini_set('session.gc_maxlifetime',12*60*60);
ini_set('session.gc_divisor', '1');
ini_set('session.gc_probability', '1');
ini_set('session.cookie_lifetime', '0');

但是我的问题是,是否可以在 12 小时过去且会话变量已过期后注销用户?换句话说,我有一个teacherlogout.php 页面,经过12 小时后,一旦用户导航到另一个页面或12 小时后刷新页面,它是否可以将用户重定向到注销页面?

更新:

这可行吗:

if ((isset($username)) && (isset($userid))){

...//WHOLE CODE

}else{

header( 'Location: teacherlogout.php' ) ;
}

【问题讨论】:

  • 我认为这会在会话到期时自动发生?
  • 对我来说,如果过了 12 小时并且我刷新了页面,那么它会显示相同的页面,但会显示未定义变量的通知。我想要的是,如果 12 小时过去了,然后导航到teacherlogout.php(自动或当用户下一个刷新页面时),以便它将用户注销并且他们不会看到这些通知
  • 嗯,你在你的代码中检查这个吗?类似于: if(isset($_session['LoggedIn'])){ showPage(); }else{ showTeacherLogin(); }
  • 另外,在测试代码时,实际上不要等待 12 小时,将 maxtime 设置为 30 秒或一分钟...
  • 我在我的代码中包含了一个更新,这可以工作吗?

标签: php


【解决方案1】:

我会在客户端上实施一些轮询。伪代码:

PHP

// hasSession.php
echo (isset($_SESSION['user_id'])); // bool

JavaScript

// Poll server
function checkSession() {

    // Assuming the function passes along the truthy or falsy response
    if (ajaxCallToHasSessionPHPResponse()) {
        setTimeout(checkSession, 10000); // Check again in 10 seconds
    } else {
        window.location = '/logout.php';
    }
}
checkSession();

【讨论】:

    【解决方案2】:

    我不建议检查变量的状态,因为在寄存器全局设置为 true 或未定义的变量被严格级别忽略的情况下,可能会使您的代码容易出现难以检测的漏洞。

    这个问题的公认答案How do check if a PHP session is empty?

    是检查访问者状态的最典型方法。然而,有一些图书馆致力于使这种系统结构化和高效。

    阅读此内容:http://www.phpeveryday.com/articles/Zend-Framework-Login-Creating-Authentication-P566.html

    它描述的是一种使用 Zend 库来确定当前访问者是否具有身份的方法,在这种情况下,是使用针对用户名的会话 id 登录的用户。即使您不使用库来促进这一点,您也可以使用相同的概念来开发自己的访问者身份检查方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-01
      • 2015-08-14
      • 2018-07-08
      • 2011-06-26
      • 2012-04-19
      • 2014-09-29
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多