2016-01-22 215 views
2

我试图让从我的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(); 
    } 
}; 
+0

我如何“解决”问题atm只是在我的ajax'fail'回调中添加一个条件来简单地重新加载页面失败。问题在于,它只能在本地运行,当我部署到在线主机时,具有真正不同的域,它不会再登录我。 – Cristy

回答

3

你在做什么是HTTP 302响应POST请求重定向。只有在请求很简单时才允许这样做。但是,由于正在从iOS生成选项请求,因此您将无法执行类似的重定向。

的原因是,根据CORS说明书中,各种HTTP重定向(301,302,303,307,或308)的被禁止为预检请求,并且将导致在网络错误。

我建议干脆删除重定向和拨打另一个电话到服务器后,认证过程结束。

+0

认为我使用passport认证,默认情况下它有一个'successRedirect'和'failureRedirect'。在'sucessRedirect'中,我返回一个要设置的自定义Cookie。我可能会试试这个:http://stackoverflow.com/questions/26859349/can-you-authenticate-with-passport-without-redirecting – Cristy

+0

删除重定向解决了这个问题。我不知道CORS中不允许重定向。 – Cristy

+0

很高兴帮助! – Sam