PHP Session ID / Session 变量值随着来自 react axios / ajax 调用的每个请求而变化

Posted

技术标签:

【中文标题】PHP Session ID / Session 变量值随着来自 react axios / ajax 调用的每个请求而变化【英文标题】:PHP Session ID / Session variable value changing on every request from react axios / ajax call 【发布时间】:2020-12-06 06:17:54 【问题描述】:

我刚刚开始使用 react js,并开始面临一些客户端系统的一些问题。在使用(axios 或 ajax)session_id() 重置和重新生成每个请求/调用时,将数据从 react js 发布到 php 文件。还有会话变量重置。我已经尝试了一些来自 *** 的解决方案,但没有任何效果。我在我的本地主机和其他一些系统中遇到了这个问题。但也可以与其他一些系统一起使用。这就像使用 50% 的系统而不使用 50% 的系统。

但是如果我做同样的事情而不用 ajax 将普通 html 文件中的 js 反应到 php 文件中。会话 ID 未重置或重新生成。

PHP 文件

<?php
session_start();
$session_val = session_id();
 header("Access-Control-Allow-Origin: *");

echo $session_val;

?>

来自 REACT JS 的 AJAX 调用

$.ajax(
        url: "http://localhost/test.php",
        type: "POST",
        data: 
          action: action,
        ,
        success: function (data) 
        ,
        error: function (jqXHR, text, errorThrown) 
          console.log(jqXHR + " " + text + " " + errorThrown);
        ,
      );

AXIOS 呼叫

    axios
    .post('http://localhost/test.php', this.state)
    .then(response =>
        console.log(response.data);

    )
    .catch(
     error => 
        console.log(error)
    );

【问题讨论】:

这可能是一个错字,但是您在 React 和 Axios 调用中的 URL 使用不同的方案(React 是 HTTP 和 Axios HTTPS),这将有不同的会话。 抱歉打错了,它不适用于 http 和 https。我已经检查过两者 您是否检查了当前会话 ID 是否作为请求标头中 cookie 的一部分发送? @ShreyasSreenivas 你能详细说明如何检查吗?你是在问下面的截图吗? screencast.com/t/4vtxrEchbw 您发送的屏幕截图显示了来自服务器的响应。我指的是客户端发送的请求中的 cookie 标头。在您发送的屏幕截图中,转到标题选项卡。检查请求标头中是否存在名为 cookie 的标头。可以参考screencast.com/t/dkgd85sfo5HX 【参考方案1】:

看起来您的浏览器没有通过 AJAX 请求发送 Cookie 标头(默认情况下他们会这样做,但我不知道为什么它不发送)。

当您的 PHP 服务器发现没有 Cookie 标头时,它会假定未设置 SessionID 并创建一个新的,并指示您的客户端将新的 SESSIONID 存储在其 cookie 中。由于这个新的 SESSIONID 不会在下一个请求中发送,因此您的服务器再次假设相同的事情,并再次创建一个新的 SESSIONID。而且这个过程每次都会发生。

要详细了解 Cookie 的工作原理,您可以参考 Using HTTP Cookies。

您可以手动获取 cookie 并将其作为标头添加到 JQuery 中的 AJAX 请求中,如下所示:

$.ajax(
        url: "http://localhost/test.php",
        type: "POST",

        headers: "Cookie": document.cookie,

        data: 
          action: action,
        ,
        success: function (data) 
        ,
        error: function (jqXHR, text, errorThrown) 
          console.log(jqXHR + " " + text + " " + errorThrown);
        ,
      );

headers AJAX 对象的属性用于向您的 HTTP 请求添加额外的标头。在这里,我们使用 document.cookie 获取浏览器存储的 cookie,并将其添加到请求标头中的 Cookie 标头中。

如果这能解决您的问题,请告诉我。

【讨论】:

根据您的指示,我添加了“headers: "Cookie": document.cookie" 但仍然没有用。我在请求标头中没有看到 cookie,它也在不断生成新的会话 ID。 您能否检查一下您的 Cookie 中是否有一个名为 PHPSESSID 的 Cookie,例如 screencast.com/t/IoI8gHy0qO 请查看以下截图,希望对您有所帮助。存储截图:screencast.com/t/9ZxXH9t3PBa 错误截图:screencast.com/t/1BQUZtYFvj 代码截图:screencast.com/t/3sYdBp6QpPQ 会话 ID 似乎没有添加到您的 cookie 中。您可以尝试在其他浏览器中运行您的网站吗?另外,删除 headers 属性,因为 Cookie 标头显然是保留的,只有浏览器可以设置它。 刚用火狐试了一下,截图:screencast.com/t/bMpGpBCijJ【参考方案2】:

根据 Shreyas Sreenivas 评论,我将 xhrFields: withCredentials: true 用于 ajax 和

axios.post('https://example.com/file.php', this.state,withCredentials: true); 对于 axios 并且它有效。但是出现了一些 Cross-Origin Request Blocked 错误,需要修复。

【讨论】:

以上是关于PHP Session ID / Session 变量值随着来自 react axios / ajax 调用的每个请求而变化的主要内容,如果未能解决你的问题,请参考以下文章

php中session_id()函数详细介绍,会话id生成过程及session id长度

php中的session_id详解

php Session配置

php Session配置

php session_id() session_name()

PHP session_id() 空