iOS CORS ajax 请求 readyState 0
Posted
技术标签:
【中文标题】iOS CORS ajax 请求 readyState 0【英文标题】:iOS CORS ajax request readyState 0 【发布时间】:2016-04-29 13:32:24 【问题描述】:我正在尝试从我的 iPhone 使用 $.ajax
进行 CORS 登录 AJAX
调用,但使用此 jqXHR
对象状态失败(到达 fail
回调):
readyState: 0,
status: 0,
statusText: "error"
在PC
上运行正常,请求成功。
在ios
上,即使请求失败,如果我刷新页面并在服务器 (Node.js) 上,我实际上也会记录下来,我可以将其视为成功的登录请求。
不同的是,在 Chrome 中,桌面的POST
登录请求被直接重定向到loginOk
页面,而来自iOS
的POST
请求首先触发了一个pre-flight OPTIONS
请求到达loginOk
页面。
Chrome 请求(来自 Node.js 控制台):
POST /login 302
GET /loginOk 200
iOS 请求(来自 Node.js 控制台):
POST /login 302
OPTIONS /ok 200
CORS 请求是从 localhost 到节点服务器 localhost:3000。
这是我的AJAX
电话:
$.ajax(
type: 'POST',
url: "http://192.168.1.2:3000/login",
data: formData,
crossDomain: true,
dataType: "json",
xhrFields:
withCredentials: true
)
而且,这是我的 CORS 中间件:
module.exports = function(req, res, next)
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', '*');
res.header('Access-Control-Expose-Headers', 'myCookie');
if ('OPTIONS' == req.method)
res.sendStatus(200);
else
next();
;
【问题讨论】:
我如何“解决”问题 atm 只是在我的 ajaxfail
回调中添加一个条件,以便在失败时重新加载页面。问题是它只能在本地工作,当我部署到在线主机时,它不会再让我登录。
【参考方案1】:
您正在做的是将 HTTP 302 响应重定向到 POST 请求。仅当请求很简单时才允许这样做。但由于 OPTIONS 请求是从 iOS 生成的,您将无法进行这样的重定向。
原因是根据 CORS 规范,预检请求不允许使用各种 HTTP 重定向(301、302、303、307 或 308),并且会导致网络错误。
我建议完全删除重定向并在身份验证过程结束后再次调用服务器。
【讨论】:
认为我使用护照身份验证,默认情况下它有一个successRedirect
和failureRedirect
。在sucessRedirect
中,我返回一个要设置的自定义cookie。我可以试试这个:***.com/questions/26859349/…
移除重定向解决了这个问题。我不知道 CORS 中不允许重定向。
我不得不提一下,为了让登录正常工作,我必须在 iOS 上编辑 Safari 设置并设置诸如始终允许 cookie 之类的设置。默认情况下,Safari 不允许 CORS cookie(您不能为另一个域设置 cookie)。我想我会解决这个问题,但实际上不使用 cookie 并通过 GET 参数而不是 cookie 设置会话 ID。以上是关于iOS CORS ajax 请求 readyState 0的主要内容,如果未能解决你的问题,请参考以下文章