Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每个请求具有不同cookie域的快速会话?_Javascript_Node.js_Session_Express_Session Cookies - Fatal编程技术网

Javascript 每个请求具有不同cookie域的快速会话?

Javascript 每个请求具有不同cookie域的快速会话?,javascript,node.js,session,express,session-cookies,Javascript,Node.js,Session,Express,Session Cookies,我的情况是,一个应用程序可以从多个不同的域访问。例如,foo.com和bar.com理论上都可以指向我的应用程序。此外,他们的子域也可以指向我的应用程序,例如red.foo.com和blue.foo.com。我正在使用Express cookie会话,会话的初始化代码如下所示: app.use(express.session({ secret: "secret", cookie: { domain: ".foo.com" }, store: new

我的情况是,一个应用程序可以从多个不同的域访问。例如,foo.com和bar.com理论上都可以指向我的应用程序。此外,他们的子域也可以指向我的应用程序,例如red.foo.com和blue.foo.com。我正在使用Express cookie会话,会话的初始化代码如下所示:

app.use(express.session({
    secret: "secret",
    cookie: {
        domain: ".foo.com"
    },
    store: new MongoStore({
        db: db
    })
}));
当用户浏览foo.com或它的任何子域时,这很有效,但bar.com不起作用。我需要同时拥有这两样东西。理想情况下,我会为每个请求将其设置为不同的域,但我不确定我将如何做到这一点。我的请求是高度异步的,如果我只是在每次请求时为整个应用程序设置它,我担心当两个调用同时出现时,它可能无法工作

这有可能吗?有人有办法解决这个问题吗?

以下是您要做的:

  • 编写一个应用程序可以用来代替默认express.session中间件的中间件
  • 在该中间件中,基于
    主机
    请求头,在每个域的express session中间件实例上安装和配置,然后实际执行适合该请求的中间件功能
伪码

var mwCache = Object.create(null);
function virtualHostSession(req, res, next) {
  var host = req.get('host'); //maybe normalize with toLowerCase etc
  var hostSession = mwCache[host];
  if (!hostSession) {
    hostSession = mwCache[host] = express.session(..config for this host...);
  }
  hostSession(req, res, next);
  //don't need to call next since hostSession will do it for you
}

app.use(virtualHostSession);

我的请求是高度异步的,如果我只是在每次请求时为整个应用程序设置它,我担心当两个调用同时出现时,它可能无法工作


你绝对不能那样做。这将是完全错误的。

@fardjad这将是理想的选择,您有更多的信息吗?我对MiddleWareSo的熟悉程度不如我所希望的那么高。本质上,我会循环浏览我希望能够设置会话的域列表,并为每个域执行一个app.use?所以会有一堆不同的
express.session
中间件在我的应用程序开始时初始化,并在我的应用程序的整个生命周期中处于活动状态?HTTP禁止域X服务器为域Y设置cookie。我相信我上面的方法解决了用户的问题,如前所述,但是,它不会为访问多个主机名的一个浏览器保留一个会话ID,而是允许一个应用程序在多个主机名上运行。是的,如果你想开始跨域共享信息,看看令人敬畏的在线广告跟踪世界,这里有很多入侵技术,如跟踪像素等。真是太感谢你了。我刚刚完成它的实现,我终于可以回家了。工作起来很有魅力。你不知道我发现这一点后有多放心。由于发生了一系列事件,这是在一个实时服务器上发生的,需要快速修复。谢谢你。@AlexTurpin你有没有机会分享中间件?太棒了!如果其他任何人正在使用这个极好的答案,并且被我刚才做的事情烧坏了:如果您使用这个,您可能需要为每个中间件创建一个单独的会话存储对象。否则,您在一个中间件上设置的cookie设置可能会通过存储泄漏到另一个中间件。