4

В моем приложении я ограничить некоторый доступ к некоторым действиям и страницам, если пользователь не вошел в меня:Обновление/Освежающий Экспресс Session

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

Вы можете попытаться использовать https://github.com/expressjs/session#sessionregenerate –

ответ

3

express-session поддерживает настройку времени maxAge, которая будет работать лучше, чем установка фиксированной даты для всех сеансов. Так что ваше использование промежуточного слоя следует вместо этого выглядеть следующим образом:

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

Далее, чтобы обновить истечение сессии, вы можете просто позвонить req.session.touch();, если это все, что вы делаете на сессию и его содержание.

У documentation есть много другой полезной информации об управлении сроком окончания сеанса и смежными темами.

+0

Это не работает для меня. Если я распечатаю req.session.maxAge в консоли по каждому запросу, я получаю «undefined». Поэтому я попытался выполнить app.use (session ({secret: «secret», saveUninitialized: true, resave: true, cookie: {maxAge: 20000}})); вместо этого и req.session.touch(), похоже, не работает, потому что сеанс все еще останавливается через 20 секунд независимо от количества запросов, которые я делаю – gcc

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 va