【问题标题】:set-cookies in response headers is 'half' working响应标头中的 set-cookies 是“一半”工作
【发布时间】:2015-08-14 10:12:52
【问题描述】:

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

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

我试过chrome和safari,结果一样。

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

响应头中的set-cookie如下(通过chrome检查):

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

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

================= 更新:

例如,account/login API:

在 AngularJS 中:

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

并用作:

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');
            }
        });
    }
}

用作:

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');
})

【问题讨论】:

  • 请准确说明您期望发生什么,以及实际发生什么?不要忘记您的 cookie 是 HttpOnly,因此根本无法在 JavaScript 中访问。
  • 这是不对的,您可以使用 Document.cookiestackoverflow.com/questions/1704991/… 使用 javascript 创建和删除 cookie

标签: jquery angularjs cookies


【解决方案1】:

由于我在响应头中有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');
        }
    });
},

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 2021-05-17
    • 2020-11-22
    • 2020-04-23
    • 2011-01-28
    • 1970-01-01
    • 2020-10-01
    • 2020-12-30
    • 2018-11-22
    相关资源
    最近更新 更多