Ajax重置PHP会话

时间:2018-03-27 14:01:25

标签: php ajax session session-variables session-cookies

我知道this question has been asked before所以我提前道歉,但我已经多次解决了他的解决方案,并没有解决我的情况下的会话重置。

我有一个简单的php页面,它输出一个用于调试的会话ID。像这样:

<?php
session_start();
echo session_id();
?>

然后我有一个简单的HTML页面jQuery,在该页面上执行ajax请求并记录输出。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
      $.post('http://localhost.api.mydomain/sid', {
        some: 'data'
      }, function(data,status) {
        console.log(data);
      });
    </script>
  </head>
  <body>
    Check your console.
  </body>
</html>

如果我手动访问网址http://localhost.api.mydomain/sid,输出永远不会改变,session_id()将保持不变,如预期的那样。但是,如果我刷新ajax页面,则每次刷新时输出的session_id()都会发生变化。

我已尝试在session.cookie_domain文件中设置php.ini,但无济于事。我为这个问题道歉,但我找不到解决办法。

2 个答案:

答案 0 :(得分:2)

这是Access-Control问题,而不是ajax问题。

当您直接从浏览器访问网址时,您正在从您正在访问的域中请求(会话)Cookie。当您使用ajax时,在这种情况下,您要求的域名不是您正在访问的域名。

api.example.com的php API文件中,试试这个。

header('Access-Control-Allow-Origin: example.com');
header('Access-Control-Allow-Credentials: true');

然后在您的ajax请求文件中,使用xhrFields参数,如此。

  $.ajax({
    url: 'https://api.example.com',
    xhrFields: { withCredentials: true },
    success: function(data) {
      console.log(data)
    }
  });

现在,只要您从原始example.com调用请求,Cookie就会按预期运行。

答案 1 :(得分:1)

原因是因为ajax请求不会随请求一起发送会话ID。这会导致session_start生成一个新的。

可能导致浏览器在ajax请求期间未发送会话cookie的原因是域名不一致。

而不是在ini文件中设置session.cookie_domain,在运行时将其设置如下

session_set_cookie_params(33600, '/', 'localhost.api.mydomain', FALSE, TRUE);
session_start();

为了帮助您调试,请转到chrome中的开发人员工具上的网络选项卡。重新加载页面并检查请求标头和响应标头。检查jquery发送请求的主机。它可能正在将请求发送到localhost。并且您可能已将站点配置为接受localhost和localhost.api.mydomain。

在您的文件中执行更多检查,执行类似

的操作
session_set_cookie_params(33600, '/', 'localhost.api.mydomain', FALSE, TRUE);
session_start();
die($_SERVER['HTTP_HOST']);

这将允许您比较jjery在ajax请求期间使用的请求URL。