重定向后清空 PHP 会话数组

时间:2021-03-24 19:00:31

标签: javascript php jquery

我一直在尝试在客户端和 PHP 文件上创建登录页面和主页(HTML 和 javascript)以检查数据库并在服务器端启动会话。

我一直在 Visual Studio 代码上使用实时服务器测试代码,我的 PHP 代码在 XAMPP Apache 服务器上运行。

我有一个 login.js 文件,它向服务器发送信息,然后检查登录是否成功:

window.onload = function onLoadFunction() {
    $("#login-form").on("submit", function (e) {
        var dataString = $(this).serialize();
        console.log("dataString: " + dataString);
        $.ajax({
          type: "POST",
          url: "http://localhost/healthcareProvider/login.php",
          data: dataString,
          success: function (res) {
            console.log(res);
            if(res == "success"){
              window.location="http://localhost:5500/index.html";
            }else{
              console.log("login failure");
            }
          }
        });
        e.preventDefault();
      });
}

我的 login.php 文件有以下代码:

<?php
session_start();

// some code to connect to database

if (password_verify($_POST['password'], $password)) {
            session_regenerate_id();
            $_SESSION['loggedin'] = TRUE;
            $_SESSION['name'] = $_POST['username'];
            $_SESSION['id'] = $id;
            echo 'success';
} else { echo 'Incorrect username and/or password!';} 
?> 

这段代码工作正常。当我执行 var_dump($_SESSION) 时,我会得到一个包含我设置的所有字段的数组。

重定向到 index.html 后,我的 index.js 文件通过向 checksession.php 文件发送 AJAX 请求来检查会话是否设置。

index.js 代码:

function checkSession(){
    $.ajax({
        url: "http://localhost/healthcareProvider/checksession.php",
        type: "GET",
        xhrFields:{
          withCredentials: true
        },
        success: function (data) {
          if(data === "success"){
            console.log("success");
          }else{
            console.log("failure: ", data);
          }
        }
    });
}

我的checksession.php代码如下:

<?php
session_start();
header('Access-Control-Allow-Origin: http://localhost:5500');
header('Access-Control-Allow-Credentials: true');

if(!isset($_SESSION['loggedin'])) {
    echo "failure";
}else{
    echo "success";
}
?>

我的问题是我每次都遇到“失败”,当我检查 var_dump($_SESSION) 时,我得到一个空的会话数组。

我已经检查了 PHPSESSID cookie 是否已发送和接收,以及会话文件是否已在 tmp/ 文件夹中创建。

知道为什么我没有得到我在 login.php 文件中设置的会话信息以及如何修复它以便我可以获取该信息吗?

抱歉问了这么长的问题,非常感谢您提出的任何建议!

2 个答案:

答案 0 :(得分:0)

这是一个基本的 HTTP 问题,即使是最粗略的互联网搜索也会发现。

“会话”依赖于来自服务器set-cookie: 响应,只有当您确实向服务器发送了某些内容时才会发生这种情况。

“重定向”不会。您告诉客户去其他地方。

答案 1 :(得分:0)

所以,我已经设法解决了我的问题。

我不知道这是否是一个很好的解释,但也许它会帮助遇到类似问题的人。

基本上,我的登录 AJAX 请求没有发送带有标头的 cookie,并且因为我正在测试登录和重定向成功登录而没有实际注销/结束会话,我的 PHP 登录文件不断创建具有新会话 ID 的新会话.我可以通过 echo session_id();

看到这一点

我在 login.php 文件中添加了以下代码:

header('Access-Control-Allow-Origin: http://127.0.0.1:5500');
header('Access-Control-Allow-Credentials: true');

并更改了我的 login.js 文件中的 AJAX 以允许发送 cookie

$.ajax({
          type: "POST",
          url: "http://localhost/healthcareProvider/login.php",
          data: dataString,
          success: function (res) {
            console.log(res);
            if(res == "success"){
              window.location="http://localhost:5500/index.html";
            }else{
              console.log("login failure");
            }
          }
        });
        e.preventDefault();
      });

这就解决了我的问题。

相关问题