javascript - 使用 CORS XHR 时浏览器不发回 cookie

标签 javascript node.js express cors

编辑 - 使用 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 中间件,它们做同样的事情,没有明显的区别

关于场景:

  1. 使用 XHR 发出 CORS 请求
  2. 服务器设置一个 cookie,正在成功发送回客户端(快速 session cookie)
  3. 下一个 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/

相关文章:

javascript - JSPM - jspm 安装给出错误 "Registry not found"

javascript - 在react.js中,为什么总是抛出'setState(...) : Can only update a mounted or mounting component. .....错误?

javascript:单击按钮时移动图像

node.js - NodeJS 相当于一个curl 请求

node.js - 无法从 Node 服务器打开 Angular 构建应用程序

node.js - hogan.js 如何调试变量

node.js - 即使我添加了安全组,也无法在特定端口上访问 EC2

javascript - 日期格式不符合要求; Angular js

linux - 当 docker 使用 `/bin/sh -c` 运行 SIGTERM 时,SIGTERM 未到达 Node 脚本

javascript - req.body 未由 body-parser 定义