Javascript 每个请求具有不同cookie域的快速会话?
我的情况是,一个应用程序可以从多个不同的域访问。例如,foo.com和bar.com理论上都可以指向我的应用程序。此外,他们的子域也可以指向我的应用程序,例如red.foo.com和blue.foo.com。我正在使用Express 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
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设置可能会通过存储泄漏到另一个中间件。