2013-01-18 44 views
7

有什麼方法可以控制會話何時以連接的會話中間件開始?控制會話以快遞和連接中間件開始

舉例來說,如果我有明確的應用程序配置:

var app = express(); 
app.configure(function(){ 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser('secret')); 
    app.use(express.session({ store:sessionStore, ... })); 
}); 

然後在要求,如果沒有會話cookie,給出一個會話開始。如果我想僅在用戶通過身份驗證時纔開始會話,該怎麼辦?

例如,假設我有兩條路線/protected/login

  • 如果有人打/protected沒有一個會話cookie,中間件將啓動新的會話。 (req.sessionnull
  • 如果有人打/protected用會話cookie,中間件將CHECK,看是否有匹配的活動會話的cookie,並設置req.session,但啓動新的會話。 (req.session可以有一個值,或者是null
  • 如果有人打/login用正確的參數,可以再一個會話開始明確和cookie設置才。

啓動一個會話應該是明確的唯一方法:

app.post('/login', function(req, res, next) { 
    // connect to database and validate user... 
    db.authenticate(req.body.user, req.body.pass, function(allow) { 
    if (allow) { 
     // START SESSION HERE 
     // this will send set the cookie 
    } 
    }); 
} 

是否存在與現有的連接會話中間件實現這一點的方法嗎?

回答

0

即使每次啓動一個會話,它都無關緊要,因爲它將是空的。如果您試圖使用它來驗證訪問(似乎是這種情況),最簡單的解決方案是在會話中設置一個屬性(如req.session.authenticated = true;),然後檢查該屬性。這種方式技術上來說,訪問者有一個會話,但只有在req.session.authenticated == true時纔會使用會話。它可能不是你正在尋找的東西,但它是完成這件事最簡單的方法。

+1

如果您正在使用後備數據庫會話存儲,然後*每個*匿名用戶將創建存儲在數據庫中的會話。 – ralouphie

+0

我明白,但是不管怎樣,你都不應該永遠保持會話數據。當會話數據過期時,應該刪除它,並且如果匿名用戶只訪問您網站上的幾個頁面,應該在他們離開後相當快地刪除。同樣,匿名用戶的會話基本上是空對象(如果我錯了,請糾正我),因此不應該是一個巨大的內存負擔。 –

+0

會話中間件的工作方式,它將爲每個用戶創建一個會話(沒有cookie)。 這意味着數據庫將爲每個不發送cookie的請求輸入一個條目。在我正在研究的系統中,這是不可接受的。 – ralouphie

2

你想要做什麼是刪除這一行:

app.use(express.session({ store:sessionStore, ... })) 

現在會話默認情況下禁用,它是由你來決定哪個控制器打算使用它們:

var useSessions = express.session({ store:sessionStore, ... }); 

var preCb = function (req, res, next) { 
    // authenticate and stuff 
    // .... 
    if (authenticated === true) { 
    next(); 
    } 
}; 

app.post('/login', useSessions, function(req, res, next) { ... }); 
app.post('/protected', preCb, useSessions, function(req, res, next) { ... });