javascript - iOS CORS ajax 请求 readyState 0

标签 javascript jquery ajax node.js cors

我正在尝试使用 $.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/

相关文章:

php - 表单需要将数据发布到 codeigniter 中的 Controller

Javascript slider 不滚动

javascript - $.getJSON 在 for 循环中没有 let 语句以实现浏览器兼容性

javascript - React 代码旁边的 jQuery 代码示例 (noob)

javascript - iPhone 因向 webview 提供 base64 导致崩溃

javascript - 在一个 img src 标签上显示不同格式的普通图像和 base64 图像

python - 无限滚动条不适用于 django

javascript - 使用 Django View 的 Ajax 请求 - 错误地捕获变量

javascript - 使用 javascript 和 ASP.NET 无法验证我的 ASP 文本框

javascript - removeChild 导致错误