2015-02-05 136 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