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.有任何想法吗?谢谢!
express-session支持基于持续时间的maxAge设置,该设置比为所有会话设置固定日期更好。因此,您的中间件用法应改为:
app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: true,
maxAge: 20000
}));
Run Code Online (Sandbox Code Playgroud)
接下来,要更新会话的到期时间,您可以仅调用req.session.touch();它是否正在处理会话及其内容。
该文档还有许多其他有关控制会话到期和相关主题的良好信息。
您可以尝试如下定义会话
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)
并且它将自动更新会话,并且仅在空闲时间过期变量中的值时才会过期