浏览器后退按钮不会破坏PassportJS + ExpressJS中的会话.如何完全终止/终止会话?

bom*_*ant 1 javascript node.js express passport-local passport.js

我的登出机制的代码是

app.get('/logout', isLoggedIn, function(req, res) {
        req.logout();
        res.redirect('/');
    });
Run Code Online (Sandbox Code Playgroud)

使用密钥的Express会话包,没有在任何地方设置Cookies.

当我在注销后单击浏览器后退按钮时,它仍允许用户返回正在进行身份验证的页面.如何完全终止此会话?

isLoggedIn只是通过PassportJS的isAuthenticated方法进行身份验证.这是什么方式?

请帮忙.提前致谢.

编辑:这是会话ID

在此输入图像描述

lag*_*lex 7

为已注销的用户有条件地设置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();
});
Run Code Online (Sandbox Code Playgroud)

这将强制浏览器获取页面的新副本,即使它们"返回".


注意:这是以禁用未登录的所有用户的缓存为代价的,为了这个答案,包括刚刚注销的用户.如果您不想为所有已注销的用户完全禁用缓存,您应该可以找到区分这两者的方法.会议的东西..

如果您确定当用户回击时,'/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');
});
Run Code Online (Sandbox Code Playgroud)

可以像这样使用吗?

没有.

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'...
Run Code Online (Sandbox Code Playgroud)