编辑 - 使用 Chrome 网络检查器查看 cookie,似乎无论 cookie 的过期值是什么,浏览器都将其设置为 session cookie 并根据请求将其删除。
我正在使用 Node.js 和 Express 为我正在教授的类(class)构建一个 CORS 示例。
但是,虽然 cookie 是从服务器设置的,但它们不会在后续请求中被发送回服务器。这几乎意味着我不能使用任何琐碎的 session 管理器。
知道我在这里缺少什么吗?为什么浏览器不将域设置的 cookie 发送回该域?这不应该自动发生吗?
编辑 - 一些代码示例: 设置 XHR 请求:
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.widthCredentials = true;
xhr.onreadystatechange = function(res){
if (xhr.readyState == 4){
cb(res,xhr);
}
};
xhr.setRequestHeader("Content-Type",'application/json');
xhr.setRequestHeader('Accept','application/json');
xhr.send(JSON.encode({param:some_param}));
服务器:
function allowCrossDomain(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', 'Content-Type,Accept,X-Requested-With');
if (req.method!='OPTIONS') return next();
res.send(204);
}
//while configuring express
app.use(allowCrossDomain)
值得一提的是,我尝试了各种 npm
中间件,它们做同样的事情,没有明显的区别
关于场景:
- 使用 XHR 发出 CORS 请求
- 服务器设置一个 cookie,正在成功发送回客户端(快速 session cookie)
- 下一个 XHR 请求不会将该 cookie 发送回服务器,因此 express 无法识别用户,因此会创建一个新的 session cookie,依此类推。
最佳答案
除了我读过的内容外,我对此一无所知,但根据 the MDN docs XHR 对象上有一个“withCredentials”属性,需要设置:
xhr.withCredentials = true;
默认为 false
。如果没有设置该标志,则不会传输 cookie,并且响应中的 cookie header 将被忽略。
edit — 我发誓我读过你的问题几次,但我完全错过了你提到的 flag 。对不起。但是,由于这不是完全浪费,我还要提到您的服务器需要在响应 header 中将“Access-Control-Allow-Credentials”标志设置为 true
,并且“Access-Control-Allow-Origin”设置为你当前的协议(protocol)+主机+端口。
关于javascript - 使用 CORS XHR 时浏览器不发回 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601149/