Обновление / Обновление Экспресс Сессии
В моем приложении я ограничиваю некоторый доступ к некоторым действиям и страницам, если пользователь не вошел в систему. У меня есть:
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 ответа
Вы можете попытаться определить вашу сессию следующим образом
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.
express-session
поддерживает основанный на продолжительности maxAge
настройка, которая будет работать лучше, чем установка фиксированной даты для всех сеансов. Таким образом, ваше использование промежуточного программного обеспечения должно выглядеть следующим образом:
app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: true,
maxAge: 20000
}));
Далее, чтобы обновить срок действия сессии, вы можете просто позвонить req.session.touch();
если это все, что вы делаете для сеанса и его содержимого.
Документация содержит много другой полезной информации о контроле истечения времени сеанса и связанных с ним темах.