【问题标题】:Session disappear after page refresh页面刷新后会话消失
【发布时间】:2018-01-30 09:54:25
【问题描述】:

这是我第一次在 PHP 上使用会话。 从 StackOverflow 和其他网站获取一些信息以构建我的第一个 PHP 登录,但我遇到了问题,不知道如何解决。

基本上在我设置会话的那一刻,页面刷新后,这个会话就消失了。不应该停留一段时间吗? (可以用set_cookie_params等设置,但这是另一个话题)

我在页面的开头(全局)有这段代码:

ini_set('session.cookie_httponly', 1);
ini_set('session.entropy_file', '/dev/urandom');
ini_set('session.hash_function', 'whirlpool');
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_secure', 1);

session_name("RANDOMID");
session_start();

if (isset($_SESSION['uid']))
{
    if ($_SESSION['ipremote'] !== getUserIP() && $_SESSION['useragent'] !== getUserAgent())
    {
        session_unset();
        session_destroy();

        session_regenerate_id(true);
    }
}
else
{
    session_regenerate_id(true);

    $_SESSION['ipremote'] = getUserIP();
    $_SESSION['useragent'] = getUserAgent();
}

然后在我的 login.php 文件中,当用户插入正确的信息时:

$_SESSION['uid'] = 3;

header("Location: index.php");
exit;

重定向后uid会话消失的问题:我在index.php页面的末尾放了var_dump变量var_dump,我只看到IP和每次在else 条件下设置的用户代理。

编辑:我试图用 session_start(); 替换会话初始化的所有内容并且它有效,我不明白为什么这个安全会话初始化它不起作用并且使会话消失。

【问题讨论】:

  • index.php 上也需要session_start();,以防您想访问 SESSION 变量和值
  • 已经设置好了,因为代码的第一部分一开始是全局的(login.php和index.php两个文件都需要)。
  • session_name("RANDOMID") – 字面意思是“RANDOMID”,还是意味着您每次都在这里随机生成一个新的 id……?
  • 这只是一个随机名称,所以它实际上是 RANDOMID(没有定义或变量)
  • 您在刚刚销毁会话时使用session_regenerate_id(true)

标签: php session


【解决方案1】:

您在测试时是否通过https:// 调用您的页面...?

否则,解释很简单:

ini_set('session.cookie_secure', 1);

这使得 PHP 使用 secure 标志设置会话 cookie,这意味着浏览器只允许通过安全连接发送此 cookie。

因此,如果您实际上仅通过 HTTP 进行测试,那么会话 cookie 将不会随下一个请求一起发回,因此 PHP 找不到任何会话 id,因此当您调用 session_start 时会启动一个全新的会话。 ..

【讨论】:

    【解决方案2】:

    当您刷新/更改页面时,RANDOMID 可能会发生变化,具体取决于您生成它的方式!
    因此,请确保在开始会话之前在所有页面中使用相同的“会话名称”,就像这样。

    登录页面

    session_name("SAME_NAME");
    session_start();
    $_SESSION['uid'] = 3;
    header("Location: index.php");
    exit;
    

    索引页面

    session_name("SAME_NAME");
    session_start();
    var_dump($_SESSION['uid']);
    exit;
    

    【讨论】:

    • 您的回答是基于名称是随机生成的假设,但 OP 在他的帖子中的 cmets 中解释说,他实际上并没有随机生成会话名称。
    【解决方案3】:

    请尝试以下稍作改动的 sn-p,以替换您在每一页开头的 global 代码。

    ini_set('session.cookie_httponly', 1);
    ini_set('session.entropy_file', '/dev/urandom');
    ini_set('session.hash_function', 'whirlpool');
    ini_set('session.use_only_cookies', 1);
    ini_set('session.cookie_secure', 1);
    
    // start session
    session_start();
    // if session just started and uid is not set, add initial information such as user agent and ip address
    if (!isset($_SESSION['uid']))
    {
        $_SESSION['ipremote'] = getUserIP();
        $_SESSION['useragent'] = getUserAgent();
    }
    else
    {
        // uid is set in session variables. User gets logged out in case of changed ip address and user agent.  
        if ($_SESSION['ipremote'] !== getUserIP() && $_SESSION['useragent'] !== getUserAgent())
        {
            session_unset();
            session_destroy();            
        }
        // if client information has not changed just regenerate the session
        session_regenerate_id(true);
    }
    

    【讨论】:

      【解决方案4】:

      尝试检查 session.save_path

      1. phpinfo() 中找到 session.save_path
      2. 检查它是否存在。如果没有,请使用 mkdir
      3. 检查其权限。改成其他人可以读/写(chmod 707)

      当我通过 yum 在我的开发服务器(AWS EC2 Linux AMI)上安装新的 php 扩展程序(SOAPClient)时,像你一样刷新或页面移动时,会话消失了。

      原因是我的会话目录的权限更改为 500,即使我什么也没做。所以 php 无法将会话文件写入磁盘。

      希望这可以帮助你:)

      【讨论】:

        【解决方案5】:

        这是因为session_start() 必须是您代码的第一行。

        您也可以在我的旧答案中看到this

        祝你好运。

        【讨论】:

          【解决方案6】:

          请在每个页面顶部使用 session_start(),访问页面上的会话数据是必需的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-20
            • 1970-01-01
            • 2019-05-16
            • 2013-01-22
            • 2014-08-16
            • 2013-05-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多