在响应axios / ajax调用的每个请求上,PHP会话ID /会话变量值都会更改

问题描述

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

但是,如果我做同样的事情而没有将js从带有ajax的普通html文件转换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)
    });

解决方法

好像您的浏览器没有发送带有AJAX请求的Cookie标头(默认情况下,它们是这样做的,但是我不知道为什么它没有发送它)。

当您的PHP服务器看到没有Cookie标头时,它假定未设置SESSONID并创建一个新的SESSONID,并指示您的客户端将新的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);
        },});
AJAX对象的

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

让我知道这是否可以解决您的问题。

,

根据 Shreyas Sreenivas 的评论,我对Ajax和

使用了 xhrFields:{withCredentials:true}

axios.post('https://example.com/file.php',this.state,{withCredentials:true}); 对于axios,它的工作原理。但是出现了“跨域请求阻止”错误,需要修复。