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 页面,而来自iOSPOST 请求首先触发了一个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 只是在我的 ajax fail 回调中添加一个条件,以便在失败时重新加载页面。问题是它只能在本地工作,当我部署到在线主机时,它不会再让我登录。 【参考方案1】:

您正在做的是将 HTTP 302 响应重定向到 POST 请求。仅当请求很简单时才允许这样做。但由于 OPTIONS 请求是从 iOS 生成的,您将无法进行这样的重定向。

原因是根据 CORS 规范,预检请求不允许使用各种 HTTP 重定向(301、302、303、307 或 308),并且会导致网络错误。

我建议完全删除重定向并在身份验证过程结束后再次调用服务器。

【讨论】:

认为我使用护照身份验证,默认情况下它有一个successRedirectfailureRedirect。在sucessRedirect 中,我返回一个要设置的自定义cookie。我可以试试这个:***.com/questions/26859349/… 移除重定向解决了这个问题。我不知道 CORS 中不允许重定向。 我不得不提一下,为了让登录正常工作,我必须在 iOS 上编辑 Safari 设置并设置诸如始终允许 cookie 之类的设置。默认情况下,Safari 不允许 CORS cookie(您不能为另一个域设置 cookie)。我想我会解决这个问题,但实际上不使用 cookie 并通过 GET 参数而不是 cookie 设置会话 ID。

以上是关于iOS CORS ajax 请求 readyState 0的主要内容,如果未能解决你的问题,请参考以下文章

AJAX请求时status返回状态明细表

Rails 跨域 ajax 获取请求 (CORS)

cors / ajax 请求的重复 OPTIONS 请求

POST AJAX 请求被拒绝 - CORS?

使用 Ajax/Javascript/Django 的 CORS 请求

AJAX请求时status返回状态明细表 readyState的五种状态