2

我正在尝试在 php 中使用会话并且没有走得太远。我所有的 php 页面都是通过 ajax 从单个“门户页面”调用的。我使用会话在 ajax 调用之间存储信息。我有一个包含文件,它是每个 ajax 页面中的第一个文件,其中 session_start 作为第一个方法调用。会话数据似乎保存正常。但是,当我在用户注销页面上完成会话时,我遇到了摆脱会话的问题。注销页面是一个 ajax 页面,它基本上是这样做的:

session_start();
    $_SESSION = array();
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
         setcookie(session_name(), '', time() - 42000,$params["path"], $params["domain"], $params["secure"], $params["httponly"]);
    }
//code to unset session variables
        session_destroy();

如果我尝试在注销页面上将会话变量写入屏幕,它是空的,如您所料。但是,如果我刷新门户页面并将 session_id 显示到屏幕上,它与上一个会话中的 ID 相同,该会话应该被破坏。如果我关闭浏览器并再次打开它,我有一个新会话

调用注销页面后,php 会话 cookie 仍在浏览器 cookie 中。自然,页面刷新将加载此 cookie。为什么cookie没有被删除?我的代码有问题还是与它是一个 ajax 页面有关?

4

2 回答 2

0

删除 cookie 时,cookie 删除将发生在告诉浏览器删除 cookie 的请求中。但在该请求期间,cookie 仍然存在。因此,在删除 cookie 的调用中看到 cookie 仍然存在是预期的行为。

因此,在注销期间/之后,cookie 仍然存在。在清除 cookie 的请求之后,cookie 只会消失 1 个请求。

如果 cookie 在注销后仍然存在于多个请求中,则尝试将 cookie 的 TIME 差异从 42000(11 小时)增加到 90000(25 小时)。也许您和客户之间存在时区差异

于 2013-05-31T09:27:35.907 回答
0

每当任何页面上有函数session_start()的实例时,浏览器通常会在客户端计算机上创建和维护会话 cookie 、cookie 名称。在浏览器或网页关闭或session_regenerate_id()在服务器上调用之前,会话 ID 将保持不变。

我猜session_start()在注销页面上可能有一个实例,这就是为什么您在浏览器 cookie 部分中不断看到会话 cookie 的原因。但是,这不应该让您担心,因为您已经删除了存储在该“会话 cookie id”session_destroy()上的任何相关数据,而在服务器端,您在浏览器 cookie 部分中看到的会话 cookie 名称只是一个等待的虚拟会话 ID大约何时开始在服务器上再次存储会话数据。

如果您不想看到通常以 PHPSESSID~ 开头的会话 cookie ID,那么您应该确保session_start()在您的注销页面上没有调用,但我必须说这是没有意义的。

希望有帮助。

于 2019-08-23T13:15:11.077 回答