【发布时间】: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.cookie, stackoverflow.com/questions/1704991/… 使用 javascript 创建和删除 cookie