我一直在尝试在客户端和 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 文件中设置的会话信息以及如何修复它以便我可以获取该信息吗?
抱歉问了这么长的问题,非常感谢您提出的任何建议!
答案 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();
});
这就解决了我的问题。