我有一个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');
})
答案 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');
}
});
},