Fetch Api 无法从 PHP 服务器获取 Session

Posted

技术标签:

【中文标题】Fetch Api 无法从 PHP 服务器获取 Session【英文标题】:Fetch Api unable to get Session from PHP server 【发布时间】:2016-08-13 00:01:11 【问题描述】:

我在我的应用程序中使用 Fetch Api。

我有一个 php 服务器页面来获取之前已经定义的会话数据。看起来像这样:

<?php
header('Content-Type: application/json; charset=UTF-8');
header('Access-Control-Allow-Origin: *');

session_start();
// $_SESSION['data'] already defined before
$result = array();
// print_r($_SESSION['data']);
if (isset($_SESSION['data'])) 
  $result = $_SESSION['data'];
  $result['code'] = 'ok';
 else 
  $result['code'] = 'error';

echo json_encode($result, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);

我还有另一个 html 页面来获取会话数据。看起来像这样:

  <script>
    $(function() 
      // use $.ajax
      $.ajax(
          url: 'session.php',
          dataType: 'json'
        )
        .done(function(res) 
          console.log(res);
        );
      // end

      // use fetch
      fetch('session.php').then(function(res) 
        if (res.ok) 
          res.json().then(function(obj) 
            console.log(obj);
          );
        
      );
      // end
    );
  </script>

问题是,当我使用 $.ajax() 时,会话数据可以正确显示。但是当我使用 fetch() 时,会话数据是未定义的。

那么,出了什么问题,我该如何解决?谢谢!

【问题讨论】:

您使用ajax,但未通过session_idstart_session 开始新会话。但是当您在浏览器上请求此脚本时,您 session_id 保存在浏览器 cookie 中,您可以获得正确的会话。 【参考方案1】:

如果您希望fetch 发送cookie,您必须提供credentials 选项。

详情请见https://developer.mozilla.org/en-US/docs/Web/API/GlobalFetch/fetch#Parameters。

【讨论】:

凭证可以设置为'same-origin' 在提供凭证选项时,'include' 和 'same-origin' 有什么区别?我似乎无法在任何地方找到此信息。 @kojow7 Check the MDN docs (我试图在这里复制粘贴,但一团糟)。基本上,这个答案的相关示例,使用“包含”,mysite.com 可以从 yoursite.com 获得会话,但使用“同源”mysite.com 无法获得 yoursite.com 的会话。【参考方案2】:

jquery ajax 是一个常见的 ajax 请求,浏览器正在发送带有会话 ID 的 cookie 标头,用于标识您的会话。

fetch 不会 - 而是创建一个没有任何数据的新会话 使用 url 或 header 发送 php session id

看看:http://php.net/manual/en/session.idpassing.php

【讨论】:

以上是关于Fetch Api 无法从 PHP 服务器获取 Session的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP 无法从 Js FormData fetch 中获取 $_POST 数据?

Fetch API 无法加载“.php”本地文件 - React JS + PHP

无法从 Wikipedia API 获取数据

Fetch API 无法加载,cors

无法使用 fetch API 获取数据

无法使用 fetch API 请求带有 HTML 页面的 localhost 节点服务器