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 标头的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 10.3 中缺少模拟器 [重复]

iOS 10.3 中的 WebView 字体不正确

如何从 iOS Swift Codable 中的 API 响应通知或打印模型类上缺少的密钥?

iOS 10.3 - 如何回复 App Store 评论?

iOS 10.3 中的备用图标

Chrome 加载第一个 AJAX 响应很慢