Node.js - сессия не сохраняется через res.redirect () - PullRequest
7 голосов
/ 01 декабря 2011

Я (почти) успешно использую Node.js с Express и Redis для обработки сессий.

У меня проблема в том, что сеанс не сохраняется, когда я использую res.redirect().

Вот как я могу это увидеть:

req.session.username = username.toString();
console.log(req.session);
res.redirect('/home');

console.log () печатает:

{ lastAccess: 1322579131762,
  cookie:
   { path: '/',
     httpOnly: true,
     _expires: Tue, 29 Nov 2011 15:06:31 GMT,
     originalMaxAge: 60000 },
  username: 'admin' }

Теперь вот следующий код:

app.get('/home', [app.requireLogin], function(req, res, next) {
// Not showing the rest as it's not even getting there
// Instead, here is what's interesting
app.requireLogin = function(req, res, next) {
  console.log(req.session);

Этот console.log () распечатывает это:

{ lastAccess: 1322579131775,
  cookie:
   { path: '/',
     httpOnly: true,
     _expires: Tue, 29 Nov 2011 15:06:31 GMT,
     originalMaxAge: 60000 } }

Очевидно, что объект 'username' исчез. Сеанс не сохранил его, а просто перестроил новый.

Как я могу решить это? Не стесняйтесь, если вам нужна какая-либо информация.

Вот код, где я устанавливаю управление сеансом:

app.configure(function() {
  // Defines the view folder and engine used.
  this.set('views', path.join(__dirname, 'views'));
  this.set('view engine', 'ejs');

  // Allow parsing form data
  this.use(express.bodyParser());

  // Allow parsing cookies from request headers
  this.use(express.cookieParser());
  // Session management
  this.use(express.session({
    // Private crypting key
    secret: 'keyboard cat',
    store: new RedisStore,
    cookie: {
      maxAge: 60000
    }
  }));
  this.use(app.router);
});

Вот весь проект (я имею в виду его части), в сущности: https://gist.github.com/c8ed0f2cc858942c4c3b (игнорировать свойства визуализированных представлений)

Ответы [ 5 ]

6 голосов
/ 18 июня 2012

Хорошо, я нашел решение. Проблема в том, что время в maxAge было добавлено к текущей дате. Таким образом, в браузере срок действия файла cookie истек в указанное время по Гринвичу.

Проблема заключалась в следующем: я использую виртуальную машину для тестирования node.js, и, знаете ... иногда вы приостанавливаете работу своей машины.

Что ж, случилось так, что машина задержалась на два дня. Таким образом, всякий раз, когда cookie был установлен на стороне сервера, клиентская сторона думала, что срок действия cookie уже истек, так как мой хост-компьютер не опоздал на два дня.

Еще один глупый исход.

2 голосов
/ 02 декабря 2011

Пробовали ли вы с разными браузерами? Вы сохраняете тот же идентификатор сеанса между перенаправлениями страницы?

Вы можете добавить req.session.cookie.expires = false; перед перенаправлением ...

1 голос
/ 14 сентября 2012

У меня была похожая проблема в том, что я устанавливал что-то в сеансе, который не сохранялся за пределами app.get(), в котором он был установлен.

Моя проблема оказалась в том, что я не делал res.redirect() в конце моего app.get(). Похоже, я что-то устанавливал для объекта запроса и затем позволял ему собирать мусор.

Я добавил res.redirect( '/nextmethod' ), и данные сохраняются очень хорошо.

1 голос
/ 02 декабря 2011

Ваш код выглядит довольно солидно, но есть ли причина, по которой вы используете client.end ()? Он принудительно закрывает соединение Redis и не является чистым. Я не думаю, что вам это нужно вообще:

https://github.com/mranney/node_redis/issues/74

Я не уверен насчет базовой архитектуры для connect-redis, но мне интересно, вызывает ли client.end сброс ваших сессий. Что произойдет, если вы их заберете?

0 голосов
/ 02 декабря 2011

Конечно, вам нужно каким-то образом сохранить этот сеанс, это может сработать.

req.session.regenerate(function(){
    req.session.username = username.toString();
    res.redirect('/home');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...