【问题标题】:php not losing session data after session_destroyphp 在 session_destroy 之后不会丢失会话数据
【发布时间】:2013-05-27 01:24:40
【问题描述】:

我正在尝试在 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 页面有关?

【问题讨论】:

  • 你为什么要在那里设置一个cookie?你为什么打电话给$_SESSION = array();
  • 您是否仍然将会话 ID 保存在 url 或隐藏的表单字段中?
  • 你确定你不是程序员吗?
  • 有什么问题?如果您在服务器上销毁会话并删除整个 SESSION 数组,则没有更多数据与该会话名称相关联
  • 尝试检查浏览器 cookie(如果找到)。也许您的浏览器没有删除 cookie。

标签: php session-cookies


【解决方案1】:

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

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 嗨。我不断刷新页面,cookie 仍然存在。那么这些刷新不是单独的请求吗?由于我使用的是 ajax,刷新是否算作删除 cookie 的同一请求?我通过在单独的选项卡中输入 url 重新加载页面,并且 cookie 仍然存在。我向域发出其他请求,但 cookie 仍然存在 :)
    • 你怎么知道cookie还在?你在看javascript吗?用php?萤火虫?
    • 嗨。查看浏览器的 cookie 集合,并将 session_id 写到屏幕上,在我注销之前和之后都显示相同的值。
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2018-11-25
    • 2020-08-24
    • 2015-08-20
    • 1970-01-01
    • 2019-04-04
    • 2013-08-10
    相关资源
    最近更新 更多