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的主要内容,如果未能解决你的问题,请参考以下文章