我正在尝试使用 $.ajax
从我的 iPhone 进行 CORS 登录 AJAX
调用,但它失败了(到达 fail
回调) 与此 jqXHR
对象状态:
{
readyState: 0,
status: 0,
statusText: "error"
}
在 PC
上运行正常,请求成功。
在 iOS
上,即使请求失败,如果我刷新页面和服务器(Node.js),我实际上会记录下来,我可以将其视为成功登录请求。
不同之处在于,在 Chrome 中,桌面版 POST
登录请求被直接重定向到 loginOk
页面,而 POST
请求来自 iOS
首先触发到达 loginOk
页面的飞行前 OPTIONS
请求。
Chrome 请求(来自 Node.js 控制台):
POST /login 302
GET /loginOk 200
iOS 请求(来自 Node.js 控制台):
POST /login 302
OPTIONS /ok 200
CORS请求是从localhost到 Node 服务器,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 请求。只有当请求很简单时才允许这样做。但由于 OPTIONS 请求是从 iOS 生成的,因此您将无法进行这样的重定向。
原因是根据 CORS 规范,各种 HTTP 重定向(301、302、303、307 或 308)都不允许用于预检请求,并且会导致网络错误。
我建议完全删除重定向并在身份验证过程结束后再次调用服务器。
关于javascript - iOS CORS ajax 请求 readyState 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34955360/