【发布时间】:2021-09-18 20:44:36
【问题描述】:
我知道存在类似这样的其他问题,但我未能成功实施其中任何一个,这意味着没有一个有效,无论是由于我自己的错误还是他们固有的无能解决这个问题。
环境:
我正在使用 php -S 127.0.0.1:8080 为 php 项目提供服务,并使用 npm start 在默认端口 (3000) 上启动了一个反应前端。我正在使用 axios 向服务器发出请求。
相关代码:
我有 2 个非常重要的文件:
- LoginPage.js 是我的反应代码所在的位置,我发出 2 个请求,第一个是模拟身份验证并启动会话,第二个请求是检查会话是否仍然存在:
useEffect(() => {
axios({
method: "get",
url: "http://localhost:8080/phpfolder/test1page.php?username=username",
dataType: "JSON",
})
.then((response) => {
console.log("response here", response.data);
setUserName(response.data);
})
.catch((error) => {
console.log(error);
});
}, []);
useEffect(() => {
if (userName !== "") {
axios({
method: "get",
url: "http://localhost:8080/phpfolder/test1page.php",
dataType: "JSON",
})
.then((response) => {
console.log("response here", response.data);
})
.catch((error) => {
console.log(error);
});
}
}, [userName]);
- test1page.php 是我的 php 代码所在的位置:
<?php
session_start();
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Headers: Content-Type');
if (isset($_GET['username'])) {
$_SESSION['username'] = $_GET['username'];
// echo $_SESSION['username'];
}
if(!isset($_SESSION['username'])){
echo 'you are not logged in';
}else{
echo 'you are logged in';
header('Content-type: application/json');
echo json_encode($_SESSION);
}
?>
问题:
我的问题是,虽然第一个请求验证没有问题:
you are logged in{"username":"username"}
第二个请求没有找到实时会话:
you are not logged in
尝试过的解决方案/调试:
我尝试了很多解决方案,包括设置withCredentials: false 和true。将其设置为 true 会导致 Cors 错误。我已经从 php 文件中添加和删除了各种头文件(一些用于 Cors,一些用于解决这个问题):
header("Access-Control-Allow-Headers: *");
header("Access-Control-Allow-Origin: http://localhost:3000");
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Disposition, Content-Type, Content-Length, Accept-Encoding");
header("Content-type:application/json");
header("connection:keep-alive");
我已经尝试过邮递员并发送一个请求来启动会话,然后另一个来检查它是否还活着就可以了:
- 第一个请求:
- 第二次请求:
【问题讨论】:
-
我的第一个猜测是会话 cookie 没有在第一个请求中正确存储,或者它没有在第二个请求中发送。您可以尝试使用以下答案中的
withCredentials或类似名称吗:stackoverflow.com/a/43178070/231316 -
您是否为 both 请求将
withCredentials设置为 true?我不仅指定 cookie 是否与跨域请求一起发回,它还首先确定浏览器是否会接受 received cookie。 -
我做了,但是将 withCredentials 设置为 true 会导致 Cors 错误。
标签: javascript php reactjs session axios