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_id
和start_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 数据?