iOS 10.3 中的 ajax 响应中缺少 Set-Cookie 标头
Posted
技术标签:
【中文标题】iOS 10.3 中的 ajax 响应中缺少 Set-Cookie 标头【英文标题】:Set-Cookie header missing from ajax response in iOS 10.3 【发布时间】:2017-08-25 02:55:44 【问题描述】:我的phonegap app和django通信,所以我使用下面文章中描述的方法来捕获并发送csrftoken:
https://docs.djangoproject.com/en/1.10/ref/csrf/
这一直有效到 ios 10.3。 在 iOS 10.3 中,ajax 调用获取除 Set-Cookie 之外的所有响应标头。 我尝试添加 xhrFields: withCredentials: true 和 crossDomain: true 但没有区别。
这里是获取 csrftoken 的请求:
$.ajax(beforeSend: function(xhr) xhr.withCredentials = true;,
type: "GET",
url: 'url', // the django view has @ensure_csrf_cookie set
xhrFields: withCredentials: true,
crossDomain: true,
success: function(data, textStatus, xhr)
// returns null in iOS 10.3
document.cookie = xhr.getResponseHeader("Set-Cookie");
,
);
相同的代码在 iOS 10.2 中运行良好,我们可以从“Set-Cookie”标头中保存 csrftoken 以供以后使用。 iOS 10.3 以某种方式阻止此“Set-Cookie”响应标头出现在 xhr 对象中,因此我们无法从服务器获取 csrftoken 并且任何后续 POST 操作都将被禁止。
【问题讨论】:
我可以确认行为,我遇到了同样的问题。找不到任何有关此更改的官方 Apple 文档。有一个 Cordova 插件可以让 cookie 在 iOS 和 android 中工作,可以帮助你。 (我还没试过) 感谢您确认该行为。我认为根本问题可能不是 cookie 本身,而是从服务器发送的 Set-Cookie 标头不知何故从 http 响应对象中丢失。调用 xhr.getAllResponseHeaders() 将返回除 Set-cookie 之外的所有预期标头,其中应包含我们需要的 csrftoken。 iOS 10.3 可能不再允许 Set-Cookie? 【参考方案1】:感谢 Selim Arsever 的建议,我可以通过使用第三方 Cordova 插件解决此问题。
步骤:
让 django 生成一个 csrftoken 并通过 JsonResponse 将数据发送到我的应用程序;
使用 cookieMaster 的 setCookieValue 将 csrftoken 设置为域 cookie。
然后可以检索 csrftoken 以在后续 POST 调用中发送到 django。
【讨论】:
伙计们,能否提供指向该 Cordova 插件的链接?谢谢! 嗨,我使用了以下插件:github.com/kristianhristov/cordova-cookie-master以上是关于iOS 10.3 中的 ajax 响应中缺少 Set-Cookie 标头的主要内容,如果未能解决你的问题,请参考以下文章