如何使用cookie手动恢复会话?

时间:2013-10-08 03:52:11

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

相关: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自动执行,我不必关心。< / p>

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

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

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

这就是饼干和会话!尽管这种配置在大多数情况下都能完美运行,但它不起作用。 session_start()函数始终在新会话中启动。最好的示例是当我访问已调用session_start()且我无法访问$_SESSION["authenticated"]的部分时。

2 个答案:

答案 0 :(得分: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*/
?>

答案 1 :(得分:2)

使用会话时不需要设置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中设置session.auto_start = true [php配置文件]