的iOS CORS Ajax请求的readyState 0
问题描述:
我试图让从我的iPhone CORS登录AJAX
通话,使用$.ajax
但它没有(达到fail
回调)这jqXHR
对象状态:的iOS CORS Ajax请求的readyState 0
{
readyState: 0,
status: 0,
statusText: "error"
}
在PC
它工作正常,请求成功。
在iOS
,即使请求失败,如果我刷新页面,我实际登录服务器(Node.js的)上我可以看到它作为一个成功的登录请求。
不同的是,在浏览器,桌面POST
登录请求被直接重定向到loginOk
页,而从所述iOS
请求POST
第一触发飞行前OPTIONS
请求到达loginOk
页。
铬请求(来自Node.js的控制台):
POST /login 302
GET /loginOk 200
iOS的请求(来自Node.js的控制台):
POST /login 302
OPTIONS /ok 200
的CORS请求来自本地主机到节点服务器,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();
}
};
答
你在做什么是HTTP 302响应POST请求重定向。只有在请求很简单时才允许这样做。但是,由于正在从iOS生成选项请求,因此您将无法执行类似的重定向。
的原因是,根据CORS说明书中,各种HTTP重定向(301,302,303,307,或308)的被禁止为预检请求,并且将导致在网络错误。
我建议干脆删除重定向和拨打另一个电话到服务器后,认证过程结束。
我如何“解决”问题atm只是在我的ajax'fail'回调中添加一个条件来简单地重新加载页面失败。问题在于,它只能在本地运行,当我部署到在线主机时,具有真正不同的域,它不会再登录我。 – Cristy