【问题标题】:Set-Cookie header missing from ajax response in iOS 10.3iOS 10.3 中的 ajax 响应中缺少 Set-Cookie 标头
【发布时间】: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?

标签: ios ajax django cordova cookies


【解决方案1】:

感谢 Selim Arsever 的建议,我可以通过使用第三方 Cordova 插件解决此问题。

步骤:

让 django 生成一个 csrftoken 并通过 JsonResponse 将数据发送到我的应用程序;

使用 cookieMaster 的 setCookieValue 将 csrftoken 设置为域 cookie。

然后可以检索 csrftoken 以在后续 POST 调用中发送到 django。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 2022-07-20
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多