Node.js和Express会话处理 - 后退按钮问题

时间:2011-05-23 11:23:08

标签: session node.js express

我的Express应用程序中有一个限制区域'/仪表板'。我使用一个非常小的函数来限制访问:

app.get('/dashboard', loadUser, function(req, res){
  res.render('dashboard', {
    username: req.session.username
  });
});

function loadUser(req, res, next){
  if (req.session.auth) {
    next();
  } else {
    res.redirect('/login');
  }
};

问题是当我通过调用...

注销用户时
app.get('/logout', function(req, res){
  if (req.session) {
    req.session.auth = null;
    res.clearCookie('auth');
    req.session.destroy(function() {});
  }
  res.redirect('/login');
});

...会话被杀,但当我在浏览器中点击Back Button时,我从浏览器的缓存中获得了受限制的页面。这意味着“/ dashboard”上没有GET,也没有用户登录验证。

我尝试在元(Jade模板)中使用no-cache但它仍然不起作用。

meta(http-equiv='Cache-Control', content='no-store, no-cache, must-revalidate')
meta(http-equiv='Pragma', content='no-cache')
meta(http-equiv='Expires', content='-1')

任何?

4 个答案:

答案 0 :(得分:52)

乔希的回答很遗憾地对我不起作用。 但经过一番搜索,我发现了这个 问题:What's the best way to deal with cache and the browser back button?

并采纳了这个node.js / express问题的答案。 您只需要更改以下行

res.header('Cache-Control', 'no-cache');

res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');

现在,每次我使用浏览器后退按钮时,页面都会重新加载而不会被缓存。

*更新快递v4.x *

// caching disabled for every route
server.use(function(req, res, next) {
  res.set('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
  next();
});

// otherwise put the res.set() call into the route-handler you want

答案 1 :(得分:6)

app.get('/dashboard', loadUser, function(req, res){
  res.header('Cache-Control', 'no-cache');
  res.header('Expires', 'Fri, 31 Dec 1998 12:00:00 GMT');

  res.render('dashboard', {
    username: req.session.username
  });
});

答案 2 :(得分:3)

我正在使用Express ^ 4.16.3,这对我来说是正确的,如@pkyeck所述。

我将它添加到我的路线中并且工作正常:

routes
.use(function(req, res, next) {
res.set('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
        next();
          })
          .get('/login', function(req, res, next){
              .....
})

答案 3 :(得分:1)

简单的解决方案是在清除会话之后..再次重定向到相同的路由..例如:route / sessionedpage有会话变量..点击注销按钮后清除会话变量req.session.destroy(function() {});之后你要去重定向主页...重定向到主页的INSTEAD ..重定向/ sessionedpage(相同的路由)...如果(!res.sessions)然后res.redirect('/ home')