【问题标题】:How to use cookies to resume session manually?如何使用 cookie 手动恢复会话?
【发布时间】:2013-10-14 20:23:21
【问题描述】:

相关:session variable not carrying over

问题

当我从一个页面导航到另一个页面时,任何 $_SESSION[""] 变量都会丢失,尽管我在尝试访问它们之前使用了 session_start();

似乎session_start() 会自动启动一个新会话,除非将session_name()session_id() 传递给它以指定要恢复的会话。

因此,当需要从服务器端显示/隐藏按钮时,按钮永远不会显示,尽管经过验证的用户之前已经过身份验证。

我在几篇文章中读到setcookie() 可以解决问题。

编辑

我必须为会话 ID 手动设置 cookie,如下所述:

Can I restore a PHP SESSION by its ID?

代码示例

login.php

<?php
require_once "logout.php";
require_once "../data/data_access.php";

$sid = session_id();
if (empty($sid)) session_start(); 

$userName = "";
$password = "";

if (isSet($_REQUEST["userName"])) $userName = $_REQUEST["userName"];
if (isSet($_REQUEST["password"])) $password = $_REQUEST["password"];

echo login($userName, $password);

function login($login, $pass) {
    if (isAuthenticUser($userName, $password)) {
        session_regenerate_id(true);
        $_SESSION["authenticated"] = true;
        setcookie("cookie_name", session_id(), time() + 1200);
    } else $_SESSION["authenticated"] = false;

    return $_SESSION["authenticated"];
}

another_file.php

<?php
$sid = session_id();
if (empty($sid)) session_start($_COOKIE["cookie_name"]); // Will this make it?
?>

通过$_COOKIE["cookie_name"] 检索会话ID 是否足够,或者我应该做其他事情以便能够继承我的会话变量值?

更新

经过一些更深入的挖掘,我发现在正常情况下,不需要使用 cookie 来恢复会话,因为 PHP 通过 PHPSESSID cookie 自动完成,我不必关心。

但是,我使用 jQuery $.post()$.ajax() 函数与 PHP 服务器通信,因此它不能像往常一样使用 URL 自动获取/发布 SID。

考虑到这一点,我设法找到了一种手动使用 cookie 的方法,因此我不会将会话和 cookie 与其他 SO 用户提到的会话和 cookie 混为一谈:

PHP Session Not Restoring from Cookies

更新 #2

根据我收到的答复,我已经验证了 PHP.ini 配置文件以查看是否启用了 cookie 等。

这里是:

session.save_path = "c:/wamp/tmp"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

cookie 和会话就是这样!尽管这种配置在大多数情况下都可以完美运行,但它不起作用。 session_start() 函数总是从一个新会话开始。最好的例子是当我转到一个已调用 session_start() 并且我无法访问我的 $_SESSION["authenticated"] 的部分时。

【问题讨论】:

  • Any $_SESSION[""] variables are lost when I navigate from a page to another你真的要通过代码解决这个问题吗?
  • 其实那是因为我使用jQuery来浏览网站的不同部分。因此,PHP 使用的自动机制,即将他自己的会话 id 放在 url 参数中的第一个位置,是行不通的。所以,我希望手动做一些事情。

标签: php session session-variables session-cookies sessionid


【解决方案1】:

使用 session 时不需要设置 cookie 名称。 php 处理会话所需的一切。 php 设置名称为 PHPSESSION 的 cookie 并使用 cookie 处理会话 id。 你的项目应该是这样的。

login.php

<?php
session_start(); 

require_once "logout.php";
require_once "../data/data_access.php";



$userName = "";
$password = "";

if (isSet($_REQUEST["userName"])) $userName = $_REQUEST["userName"];
if (isSet($_REQUEST["password"])) $password = $_REQUEST["password"];

echo login($userName, $password);

function login($login, $pass) {
    if (isAuthenticUser($userName, $password)) {
        $_SESSION["authenticated"] = true;
    } else $_SESSION["authenticated"] = false;

    return $_SESSION["authenticated"];
}

another_file.php

<?php
session_start();

echo $_SESSION["authenticated"];
?>

但请记住,您应该在文件开头调用 session_start() 函数或在 php.ini [php 配置文件] 中设置 session.auto_start = true

【讨论】:

  • 这应该在正常情况下工作。但是,它在我的场景中不起作用,因为我使用 jQuery 和 jQuery UI 来弹出对话框并在站点的部分之间导航,而无需更改 URL!所以,它不起作用。当我访问 $_SESSION["authenticated"] 时,页面说我尝试访问一个未定义的变量,也就是说,因为session_start() 总是启动一个新的会话,而不是恢复我想要的会话。因此,为了能够恢复会话,我需要设置会话 cookie 来记住会话身份并恢复这个会话,而不是一个新的会话。
  • +1 这实际上并没有解决我的问题,但这实际上是在清理session_start() 之后工作的。我从未通过身份验证的原因之一是从未使用过$login 参数。我的错,因为我重构了代码并省略了将调用中的$login$userName 参数更改为isAuthenticuser()。不过还是谢谢你的回答! =)
【解决方案2】:

如果你想使用Session,你不需要创建Cookie,因为它是由php创建的,就像你说的那样。

为了在每个 php 页面的开头使用会话位置 session_start()

如果要更改 PHP 会话创建的 cookie 名称,请使用 session_name("CookieName")

//Sample Php Page
<?php
session_name("eNGiT");
session_start();
/*Do your Session Based Stuff Below using $_SESSION variable*/
?>

【讨论】:

  • 事实上,这在使用标准网页时非常有用。但是,当您使用 jQuery 发布、ajax 或在页面本身的简单 div 中加载内容时,这种机制根本不起作用,因此即使您在网站上导航,URL 也不会改变。
  • 请务必在使用 jQuery ajax 调用调用的页面上使用 session_start(),因为 jQuery 进行的 ajax 调用会自动在其请求中绑定 cookie。请检查这个答案stackoverflow.com/a/1564496/2858188尝试使用简单页面的ajax来调试问题,并在ajax返回结果中使用console.log打印内容
  • +1 手动提及包含会话 ID 的 cookie 的名称有效。或许您能详细说明一下如何设置 cookie 并使其正常工作以供将来参考?
  • 您的 php.ini 会话配置看起来不错。你能给出你正在使用的示例代码吗?因为,您似乎在一个页面上使用 session_name() 而在接下来的页面中您没有在 session_start() 之前调用它,所以这些函数一起工作,这意味着如果您使用它,您必须调用 session_name() , 然后 session_start() 在与 $_SESSION 一起工作的每个页面上,关于 cookie,您不需要为 PHP SESSION 创建它们。
猜你喜欢
  • 2012-02-10
  • 1970-01-01
  • 2020-03-11
  • 2017-05-19
  • 2012-07-08
  • 2011-06-24
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多