更新/刷新快速会话

gcc*_*gcc 7 session-timeout session-cookies node.js express passport.js

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

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

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

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

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

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

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

msc*_*dex 5

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

app.use(session({
  secret: 'secret',
  saveUninitialized: true,
  resave: true,
  maxAge: 20000
}));
Run Code Online (Sandbox Code Playgroud)

接下来,要更新会话的到期时间,您可以仅调用req.session.touch();它是否正在处理会话及其内容。

文档还有许多其他有关控制会话到期和相关主题的良好信息。

  • 我认为你必须使用 req.session.cookie.maxAge (2认同)

The*_*age 5

您可以尝试如下定义会话

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

然后使用刷新

req.session.touch()
Run Code Online (Sandbox Code Playgroud)

或者您可以将会话定义为

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

并且它将自动更新会话,并且仅在空闲时间过期变量中的值时才会过期