在我的应用中,如果用户未登录,我会限制对某些操作和页面的访问。我有:
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。有任何想法吗?谢谢!
答案 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变量中的值空闲时到期