2013-09-30 97 views
10

我有一種情況,可以從多個不同的域訪問應用程序。例如,foo.combar.com可能在理論上都指向我的應用程序。此外,他們的子域名也可以指向我的應用,例如red.foo.comblue.foo.com。我用快遞的Cookie會話,我對會話初始化代碼看起來像這樣:每個請求使用不同的Cookie域快速會話?

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

,對於當用戶經過foo.com或任何它的子域的效果很好,但bar.com將無法​​正常工作。我需要一次擁有兩個。理想情況下,我會根據要求將其設置爲不同的域,但我不確定我會如何做到這一點。我的請求是非常異步的,如果我在每次請求時都將其設置爲整個應用程序,那麼當兩次調用立即進入時,我擔心它可能不起作用。

這是可能的嗎?有沒有人有任何想法來解決這個問題?

+0

@fardjad這將是理想的,你會有更多的信息嗎?我不像我希望的那樣熟悉中間件 –

+0

因此,本質上來說,我會遍歷我希望能夠設置會話的域列表,併爲每個域設置一個app.use?那麼在我的應用程序開始時會有一堆不同的'express.session'中間件初始化,並且在我的應用程序的整個生命週期中都處於活動狀態? –

回答

15

這裏就是你要做的:

  • 寫一箇中間件您的應用程序來代替默認express.session中間件在中間件​​
  • 的基礎上,host請求頭instatiate的使用和配置上的實例每個域快遞會議中間件,然後竟爲此請求

執行中間件功能適當
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); 

我的要求是高度異步的,如果我只是將它設置爲整個應用程序的每一個請求,我怕當兩個電話打進來就可能無法正常工作。

絕對不能這樣做。這將是完全不正確的。

+0

HTTP禁止域X服務器爲域Y設置cookie。我相信我上面的方法解決了用戶所描述的問題,但是它不會爲訪問多個主機名的瀏覽器提供單個會話ID,但它會允許一個應用程序可以在多個主機名上運行。 –

+0

是的,如果你想開始跨領域分享信息,看看沒有比追蹤像素等入侵技術的阿森納在線廣告追蹤的真棒世界更遠。 –

+0

聖地獄非常感謝你。我剛完成實施,我終於可以回家了。奇蹟般有效。你不知道我是如何得到解脫的。由於一系列事件,這發生在一臺活動服務器上,需要快速修復。謝謝。 –

相關問題