每个请求使用不同的Cookie域进行快速会话?

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

app.use(express.session({ secret: "secret", cookie: { domain: ".foo.com" }, store: new MongoStore({ db: db }) })); 

这对于用户浏览foo.com或其子域名时效果很好,但bar.com不起作用。 我需要同时拥有两个。 理想情况下,我会将它设置为不同的域每个请求,但我不知道我会怎么做。 我的请求是非常asynchronous的,如果我在每次请求时都将其设置为整个应用程序,那么当两次调用同时进入时,我担心这可能不起作用。

这是可能吗? 有没有人有任何想法来解决这个问题?

这是你做的:

  • 编写一个中间件,您的应用程序可以使用代替默认的express.session中间件
  • 在该中间件中,基于host请求头在每个域中对快速会话中间件的实例进行安装和configuration,然后实际执行适合于该请求的中间件function

伪代码

 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); 

我的请求是非常asynchronous的,如果我在每次请求时都将其设置为整个应用程序,那么当两次调用同时进入时,我担心这可能不起作用。

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