【问题标题】:Immortal PHP Session不朽的 PHP 会话
【发布时间】:2016-08-30 13:50:09
【问题描述】:

我在销毁会话以进行注销时遇到了一些问题。当我销毁会话时,它会不断回来。

我使用的代码如下:

public function kill_login(){
    global $response;
    session_start();
    $response->message = "Current session" . json_encode($_SESSION);
    // Unset all of the session variables.
    unset($_SESSION);
    $_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"]
        );
    }
    session_destroy();
    session_write_close();
    
    $response->message .= "Session Destroyed" . json_encode($_SESSION);
}

回复如下

这是通过异步 AJAX 请求调用然后重新加载

$("<button>").text("Logout").click(function(){
    var logOut = {
        action:"logOut"
    };
    alert(SAJAX.getJSON(logOut,dataLoc).message);
    location.reload();
})

(SAJAX.getJSON 只是一种简化使用 AJAX 处理我的标准请求的方法,我经常使用它就好了)

然后页面重新加载,不知何故会话仍然存在,我可以再次单击注销按钮,仍然得到同样的结果。

我只在三个地方使用了session_start():检查登录(为页面建立会话)、登录和终止登录,因为它是一个 AJAX 请求。

有什么想法吗??

编辑:我对其进行了调整以删除第二个 session_start() 并添加 write_close 相同的结果。

【问题讨论】:

  • 您启动了会话,然后将其销毁,然后再次启动。问题来了。
  • 您在取消设置的同一页面中开始会话。
  • 另外,您只是在调用该函数时才开始会话。将session_start(); 作为第一行,n'est-ce pas?
  • 我只是启动会话来调试值并显示它设置为 []。
  • 哦,主啊,我刚刚想通了....... 显然 location.reload() 对 POST 数据表示不满。因为我刚从登录页面到达,所以每次我执行location.reload() 时都会重新登录。会议快要死了,我每次都在做一个新的。改为window.location.href = "logon.php";

标签: php jquery ajax session


【解决方案1】:

问题不在于 PHP,而在于调用 location.reload(); 将重新发送 POST 数据。由于登录页面立即将页面发布到该页面,因此注销调用正在破坏会话,因此由于重新发送到页面的 POST 以启动登录方法,因此正在创建一个新会话。

location.reload() 更改为 window.location.href = "logon.php"; 解决了该问题,因为该页面不再发送 POST 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-23
    • 2013-05-21
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多