2015-02-05 30 views
0

我退出機制的代碼是通過使用密鑰一個快速會話包瀏覽器後退按鈕不會破壞PassportJS + ExpressJS中的會話。如何完全終止會話?

app.get('/logout', isLoggedIn, function(req, res) { 
     req.logout(); 
     res.redirect('/'); 
    }); 

上午,沒有設置任何地方的Cookie。

雖然我在註銷後單擊瀏覽器後退按鈕,但它仍然允許用戶返回正在進行身份驗證的頁面。我如何完全終止此會話?

isLoggedIn僅通過PassportJS的isAuthenticated方法進行身份驗證。這裏有什麼出路?

請幫忙。提前致謝。

編輯:這是會話ID

enter image description here

+0

這很可能是從瀏覽器的緩存中顯示內容,這意味着它沒有打到網絡,所以你可以做的事情不多。 – mscdex 2015-02-05 14:53:52

回答

4

設置Cache-control頭來no-cache有條件用於註銷用戶

app.use(function(req, res, next) { 
    if (!req.user) 
     res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); 
    next(); 
}); 

這將迫使瀏覽器以獲取新的副本甚至當他們擊中「返回」頁面時。


注:這是以禁用緩存這還沒有登錄,這對於這個答案的目的包括剛剛退出的那些所有用戶的成本。如果您不想完全禁用緩存,則應該找到一種方法來區分這兩種緩存。所有已註銷的用戶。有會話的東西..

如果你確定當用戶回來,'/login'是他們將登陸的路線,那麼你可以只在那裏定義它,從而節省自己的麻煩做到上述。


確切部位在哪裏這段代碼去?

app.get('/logout', isLoggedIn, function(req, res) { 
    req.logOut(); 
    if (!req.user) 
     res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); 
    res.redirect('/login'); 
}); 

它可以這樣使用嗎?

app.get(或app.use)定義的路由。文檔:http://expressjs.com/api.html#request

app.get('/logout'...只有來如果路由'/logout'由客戶端請求的執行。

app.use(...)(未指定任何路由)將針對所有請求執行。

這些路由「中間件」(當它們被調用時)也相繼被執行。(你會在上面提到的文檔瞭解更多信息)

您需要的任何其他途徑之前設置頁眉,因此,無論這些其他途徑渲染,渲染與強制無效用戶的緩存頭。

// > HERE < 
// before all the other routes 

app.get('/logout'... 
app.get('/login'... 
app.get('/'... 
app.get('/stuff'... 
+0

謝謝..這可能是一個n00b問題,但這個代碼到底在哪裏? '代碼 app.get( '/註銷',isLoggedIn,功能(REQ,RES){ req.logOut();如果 (req.user) res.header( '緩存控制',「私人! ,no-cache,no-store,must-revalidate'); res.redirect('/ login'); }); ' 它可以這樣使用嗎? – theChinmay 2015-02-05 18:38:47

+0

@Chinya_DotA結帳更新回答 – laggingreflex 2015-02-05 19:54:20

+0

謝謝!這就像一個魅力! :) – theChinmay 2015-02-06 09:50:43