Як закінчити сеанс у ExpressJS


88

Я відчуваю, що це має бути поховано десь у документації, але я не можу його знайти.

Як закрити, закінчити або вбити (що завгодно) сеанс у ExpressJS?

Відповіді:


121

Express 4.x Оновлена ​​відповідь

Обробка сеансів більше не вбудована в Express. Ця відповідь стосується стандартного модуля сеансу: https://github.com/expressjs/session

Щоб очистити дані сеансу, просто використовуйте:

req.session.destroy();

Документація з цього приводу трохи марна. Він говорить:

Знищує сеанс, видаляючи req.session, буде відтворено наступний запит. req.session.destroy(function(err) { // cannot access session here })

Це не означає, що поточний сеанс буде перезавантажений при наступному запиті. Це означає, що при наступному запиті у вашому сховищі сесій буде створено чистий порожній сеанс. (Імовірно, ідентифікатор сеансу не змінюється, але я не тестував цього.)


чи є спосіб знищити сеанс із сеансів, а не безпосередній запит. Наприклад, якби я хотів реалізувати вийти з усіх функцій пристроїв, мені це було б потрібно
Мухаммад Умер

1
@MuhammadUmer Наскільки мені відомо, не існує вбудованого механізму знищення довільної сесії. Ви можете легко реалізувати це, видаливши ключі, пов’язані з сеансом, із сховища, або створивши власну обгортку сеансу.
Бред

93

Неважливо, це так req.session.destroy();


8
Це не працює для мене на Express 3 .. Я намагаюся зателефонувати ´req.session.destroy () ´
acidghost

6
Мені добре працює на ExpressJS 3.00. Використовується req.session.destroy();як кислотний привид.
гексаціанід

1
використання req.session.destroy () також працює для мене в express 2.5
TulioPa

1
Де це задокументовано? Я намагаюся його знайти.
huggie

25

Питання не уточнило, який тип сховища сесій використовується. Обидві відповіді здаються правильними.

Для сеансів на основі файлів cookie:

З http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Для сесій Redis тощо.

req.session.destroy // Deletes the session in the database.

1
req.session.destroy по суті є обгорткою для "видалення req.session", див. вихідний код тут: github.com/expressjs/session/blob/master/session/session.js
tfmontague


6

використовувати,

delete req.session.yoursessionname;

Я б дуже хотів побачити документ про це.
Ледачий

5
Для всіх, хто голосує проти @Nithin; метод функції session.destroy (), як це задокументовано на github (github.com/expressjs/session/blob/master/session/session.js), використовує "delete this.req.session" - це не зовсім відповідь @ Nithin, але використання "видалити" також є правильним рішенням (і не розглядається в інших відповідях).
tfmontague

Чи це правильне рішення? Ніякого витоку пам’яті, нічого лихого не станеться, чи не так?
Раджат,

5

Використовуючи req.session = null;, насправді не видалить екземпляр сеансу. Найбільш правильним рішенням буде req.session.destroy();, але це, по суті, обгортка для delete req.session;.

https://github.com/expressjs/session/blob/master/session/session.js

Session.prototype.destroy = function(fn){
  delete this.req.session;
  this.req.sessionStore.destroy(this.id, fn);
  return this;
};

5

Session.destroy (зворотний дзвінок)

Знищує сеанс і скасовує властивість req.session. Після завершення буде викликаний зворотний виклик.

Безпечний шлях ↓ ✅

req.session.destroy((err) => {
  res.redirect('/') // will always fire after session is destroyed
})

Незахищений спосіб ↓ ❌

req.logout();
res.redirect('/') // can be called before logout is done

0
req.session.destroy(); 

Вищевказане не працювало для мене, тому я зробив це.

req.session.cookie.expires = new Date().getTime();

Встановивши термін дії файлу cookie на поточний час, сеанс закінчився самостійно.


-5

Як вже згадувалося в кількох місцях, я також не можу змусити коректно працювати функцію req.session.destroy ().

Це моя робота навколо .. здається, це трюк, і все ще дозволяє використовувати req.flash

req.session = {};

Якщо видалити або встановити req.session = null; , здається, тоді ви не можете використовувати req.flash


1
Це проблема безпеки, оскільки вона не змінює хеш сеансу
Tosh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.