为什么PHP会话本身看起来是空的
我正在建立一个网站,我有2个页面,一个用于登录,一个用于上传文件 当用户登录时,我将从数据库中获取的该用户的ID设置到为什么PHP会话本身看起来是空的,php,session,upload,fetch,Php,Session,Upload,Fetch,我正在建立一个网站,我有2个页面,一个用于登录,一个用于上传文件 当用户登录时,我将从数据库中获取的该用户的ID设置到$\u SESSION变量中,当用户转到第二个页面时,他可以上传一个文件,并将对该文件的引用和ID存储到数据库中 我的前端btw位于完全不同的域中,因此当用户上载文件时,$\u SESSION变量将为空,我如何解决 PHP检查example.com上的登录页面 <?php session_start(); if (isset($_SERVER['HTTP_ORIGIN'
$\u SESSION
变量中,当用户转到第二个页面时,他可以上传一个文件,并将对该文件的引用和ID存储到数据库中
我的前端btw位于完全不同的域中,因此当用户上载文件时,$\u SESSION
变量将为空,我如何解决
PHP检查example.com上的登录页面
<?php
session_start();
if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
$a = headers_list();
require "Connessione.php";
$connessione = new Connessione();
$ris = $connessione->getUtente($_POST['id']);
if($risposta['esisteGia'])
{
$_SESSION['ID'] = $ris[0]['IDUtente'];
$_SESSION['Tipo'] = $ris[0]['Ruolo'];
}
echo json_encode($risposta);
?>
const esisteGia = () => {
async function controllaCheEsistaGia() {
let udid = "123";
let data = new FormData();
data.append("id", udid);
let risposta = await fetch(
"https://example.com/checkLogin.php",
{
method: "POST",
body: data,
credentials: "include"
}
);
risposta = await risposta.json();
console.log(risposta);
}
controllaCheEsistaGia();
};
session_start();
if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
if(!isset($_SESSION['ID'])). //Here the session is now empty again
{
header("Location: {$_SERVER['HTTP_ORIGIN']}/Login");
die();
}
header('Content-Type: application/json; charset=utf-8');
$filePDF = $_FILES['pdfDaCaricare']['tmp_name']; //Also the $_FILES is not set, and I don't know why
此时将设置$\u会话
example.com上的uploadFile.php
<?php
session_start();
if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
$a = headers_list();
require "Connessione.php";
$connessione = new Connessione();
$ris = $connessione->getUtente($_POST['id']);
if($risposta['esisteGia'])
{
$_SESSION['ID'] = $ris[0]['IDUtente'];
$_SESSION['Tipo'] = $ris[0]['Ruolo'];
}
echo json_encode($risposta);
?>
const esisteGia = () => {
async function controllaCheEsistaGia() {
let udid = "123";
let data = new FormData();
data.append("id", udid);
let risposta = await fetch(
"https://example.com/checkLogin.php",
{
method: "POST",
body: data,
credentials: "include"
}
);
risposta = await risposta.json();
console.log(risposta);
}
controllaCheEsistaGia();
};
session_start();
if (isset($_SERVER['HTTP_ORIGIN'])) {
header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); // cache for 1 day
}
if(!isset($_SESSION['ID'])). //Here the session is now empty again
{
header("Location: {$_SERVER['HTTP_ORIGIN']}/Login");
die();
}
header('Content-Type: application/json; charset=utf-8');
$filePDF = $_FILES['pdfDaCaricare']['tmp_name']; //Also the $_FILES is not set, and I don't know why
example2.com/uploadFile
const caricaFile = async e => {
const fd = new FormData();
fd.append("pdfDaCaricare", file);
await axios.post(
"example.com/uploadFile.php"
fd,
{
method: "POST",
credentials: "include",
headers: {
"content-type": "multipart/form-data"
},
onUploadProgress: function(progressEvent) {
let percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
document.getElementById("percentuale").innerText = percentCompleted;
}
}
);
};
即使在localhost中,这也不起作用会话Cookie仅适用于一个域,因此甚至可能会出现会话问题
可能使用不同的方法来验证您的用户。我的前端btw位于完全不同的域上,这意味着什么。你是说你登录到一个域并从另一个域上传吗?#决不要使用key
['ID']
进行sessionRiggsFolly:我的后端php文件在一个域上,而HTML、CSS和JS文件在另一个域上。泽利卡:这可能是问题所在吗?@DavideVitiello将其更改为['myId']
或其他任何内容,您将看到:)@DavideVitiello抱歉,我刚刚在PHP7.3上测试了它,并且它与['ID']
一起工作,所以这可能不是问题。但通常建议您在会话中定义自己的自定义密钥。并始终选中isset&!空
并且无法将会话cookie从一个域传递到另一个域?对于子域,通过会话cookie在同一域后面传递其他资源。您可以通过某个存储在后端共享会话,然后通过url或其他方式传递会话id来尝试还原会话。不知道为什么有些人开始否决我的答案,似乎他们不明白。检查你的会话cookie,了解它创建了什么域。可能这篇文章还验证了会话cookie值是否在php中,以便可以恢复会话