每个请求使用不同的 cookie 域进行快速会话?
Posted
技术标签:
【中文标题】每个请求使用不同的 cookie 域进行快速会话?【英文标题】:Express session with different cookie domain per request? 【发布时间】:2013-10-06 21:51:37 【问题描述】:我有一种情况,可以从多个不同的域访问应用程序。例如,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 不起作用。我需要同时拥有两者。理想情况下,我会根据请求将其设置为不同的域,但我不确定我会如何做到这一点。我的请求是高度异步的,如果我只是在每次请求时为整个应用程序设置它,我担心当两个调用同时进入时它可能无法正常工作。
这有可能吗?有没有人有解决这个问题的想法?
【问题讨论】:
@fardjad 这将是理想的,你有更多的信息吗?我不像我希望的那样熟悉中间件 所以本质上,我会遍历我希望能够设置会话的域列表,并为每个域执行一个 app.use?所以会有一堆不同的express.session
中间件在我的应用程序开始时初始化,并且在我的应用程序的整个生命周期中都处于活动状态?
【参考方案1】:
这就是你要做的:
编写一个您的应用可以使用的中间件来代替默认的 express.session 中间件 在该中间件中,基于host
请求标头在每个域的快速会话中间件实例上进行实例化和配置,然后实际执行适合该请求的中间件功能
伪代码
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);
我的请求是高度异步的,如果我只是在每次请求时为整个应用设置它,我担心当两个调用同时进入时它可能无法正常工作。
你绝对不能那样做。这将是完全错误的。
【讨论】:
HTTP 禁止域 X 服务器为域 Y 设置 cookie。我相信我上面的方法解决了所描述的用户问题,但是它不会为访问多个主机名的一个浏览器保留单个会话 ID ,但它将允许单个应用程序在多个主机名上运行。 是的,如果您想开始跨域共享信息,只需看看令人敬畏的在线广告跟踪世界就可以找到大量侵入性技术,例如跟踪像素等。 天哪,非常感谢。我刚刚完成了它,我终于可以回家了。奇迹般有效。你不知道我明白了这一点是多么的欣慰。由于一系列事件,这发生在实时服务器上,需要快速修复。谢谢。 @AlexTurpin 有没有机会共享中间件? 太棒了!万一其他人正在使用这个出色的答案并被我刚刚做的同样事情所烧毁:如果您使用它,您可能需要为每个中间件创建一个单独的会话存储对象。否则,您在一个中间件上设置的 cookie 设置可能会通过存储泄漏到另一个中间件。以上是关于每个请求使用不同的 cookie 域进行快速会话?的主要内容,如果未能解决你的问题,请参考以下文章