响应标头中的set-cookies是'half'工作

时间:2015-08-13 06:53:29

标签: jquery angularjs cookies

我有一个node.js API服务器(例如http://host:9002)需要在客户端设置cookie,而我有两个版本的客户端,一个jQuery和一个AngularJS。两个客户都在例如nginx后面的http://host:8001作为静态文件。

问题是完全相同的API服务器返回与set-cookie头完全相同的响应,但是在jQuery客户端中,在AngularJS客户端中根本没有设置cookie,一切都很好。这就是我所说的'半'工作,让我非常沮丧。

我尝试过chrome和safari,结果相同。

在AngularJS客户端中,我使用$resource发送请求,而jQuery是'$ .ajax'。

响应头中的set-cookie是以下一个(由chrome检查):

connect.sid=<some session id here>; Path=/; HttpOnly

我试过的是移动jQuery客户端也在http://host:9002服务,这使得set-cookie头工作。对我来说,看起来我违反了同源政策。但是为什么angularJS客户端正在工作呢?

================= UPDATE:

例如,account/login API:

在AngularJS中:

m.factory('accountlogin', ($resource)->
  $resource(UrlServer+'/account/login',{},{
    login: {method:'PUT', params:{}, isArray:false}
  })
)

并使用as:

accountlogin.login({
    username: u,
    password: p,
  }, function(r) {
    //some callback here;
  });

在jQuery中:

sys{
    req:function(url, type, data,callback){
        var path = sys.SERVER_BASE;
        $.ajax({
            type : type,
            url : path + url,
            dataType : "json",
            data:data,
            success : function(data){
                if(callback)callback(data)
            },
            error:function(data){
                if(callback)callback(data)
                console.log('fail');
            }
        });
    }
}

使用as:

var _data = {
    username:$('.loginName').find('input').val(),
    password:$('.loginPassword').find('input').val(),
}

sys.req("account/login", 'PUT', _data, function(data){
    if(data.status == 'success'){
        // some success callback
    }else if(data.status == 'failed'){
        // some failed callback
    }else sys.output('Login failed');
})

1 个答案:

答案 0 :(得分:1)

由于我在Response标头中有Access-Control-Allow-Credentials: true,我在$ .ajax中添加xhrFields: { withCredentials: true },最后可以设置cookie。

源代码如下:

req:function(url, type, data,callback){
    var path = sys.SERVER_BASE;
    $.ajax({
        type : type,
        url : path + url,
        dataType : "json",
        data:data,
        xhrFields: { withCredentials: true },
        success : function(data){
            if(callback)callback(data)
        },
        error:function(data){
            if(callback)callback(data)
            console.log('fail');
        }
    });
},