【发布时间】: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