更新/刷新快速会话

时间:2015-08-09 20:04:24

标签: node.js express session-cookies passport.js session-timeout

在我的应用中,如果用户未登录,我会限制对某些操作和页面的访问。我有:

var restrict = function(req, res, next) {
    if (!req.user) {
      console.log("USER isn't logged in.")
      return res.status(403).send('Access or action denied, please log in'); 
    }
    next();
}


app.get('/stocks', restrict, MainHandler.findAllStocksFromUser);
app.get('/stocks/:id', MainHandler.findStockByIdAndDates);
app.put('/stocks/:id/stockActions', restrict, MainHandler.handleStockAction);

我实际上是在每次客户端向服务器发出请求时尝试刷新会话,这样服务器就不会注销用户/销毁会话。对于测试,我希望会话过期/用户在20秒后退出而无需用户向服务器发出请求。我有:

    app.use(session({secret: 'secret', saveUninitialized: true, resave: true, expires: new Date(Date.now() + (20000))}));

然后我尝试使用中间件在每次使用请求时刷新过期日期:

// Session-persisted message middleware
app.use(function(req, res, next){
  req.session.cookie.expires = new Date(Date.now() + 20000);
  next();
});

但是,如果我从客户端登录,并点击周围,导致对服务器的请求,我仍然会在20秒后在客户端上收到登录错误,尽管尝试“刷新”中间件中的会话。我也尝试使用与中间件相同的策略使用maxAge。有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:4)

express-session支持基于持续时间的maxAge设置,该设置比为所有会话设置固定日期更有效。因此,您的中间件用法应该是:

app.use(session({
  secret: 'secret',
  saveUninitialized: true,
  resave: true,
  maxAge: 20000
}));

接下来,要更新会话的到期时间,只需调用req.session.touch();即可,只要您正在对会话及其内容进行操作。

documentation在控制会话过期和相关主题方面有很多其他好的信息。

答案 1 :(得分:4)

您可以尝试按如下方式定义会话

app.use (
   session ({
      secret: "secret",
      saveUninitialized: true,
      resave: true,
      cookie: {
         expires: 20 * 1000
      }
   })
);

然后使用

刷新会话
req.session.touch()

或者您可以将会话定义为

app.use (
   session ({
      secret: "secret",
      saveUninitialized: false,
      resave: true,
      rolling: true,
      cookie: {
         expires: 20 * 1000
      }
   })
);

它会自动更新会话,它只会在expires变量中的值空闲时到期