Cách kết thúc phiên trong ExpressJS


88

Tôi cảm thấy như điều này phải được chôn ở đâu đó trong tài liệu, nhưng tôi không thể tìm thấy nó.

Làm cách nào để bạn đóng hoặc kết thúc hoặc hủy (bất cứ điều gì) một phiên trong ExpressJS?

Câu trả lời:


122

Câu trả lời cập nhật Express 4.x

Xử lý phiên không còn được tích hợp vào Express. Câu trả lời này đề cập đến mô-đun phiên tiêu chuẩn: https://github.com/expressjs/session

Để xóa dữ liệu phiên, chỉ cần sử dụng:

req.session.destroy();

Tài liệu này hơi vô ích về điều này. Nó nói rằng:

Hủy phiên, xóa req.session, yêu cầu tiếp theo sẽ được tạo lại. req.session.destroy(function(err) { // cannot access session here })

Điều này không có nghĩa là phiên hiện tại sẽ được tải lại trong lần yêu cầu tiếp theo. Nó có nghĩa là một phiên trống sạch sẽ được tạo trong cửa hàng phiên của bạn theo yêu cầu tiếp theo. (Có lẽ ID phiên không thay đổi, nhưng tôi chưa kiểm tra điều đó.)


có cách nào để hủy phiên khỏi các phiên chứ không phải theo yêu cầu ngay lập tức. Ví dụ nếu tôi đã thực hiện đăng nhập tôi ra khỏi tất cả các thiết bị chức năng tôi cần mà
Muhammad Umer

1
@MuhammadUmer Theo tôi biết, không có cơ chế tích hợp nào để hủy một phiên tùy ý. Bạn có thể tự mình thực hiện điều này một cách dễ dàng bằng cách xóa các khóa được liên kết với phiên khỏi bộ nhớ hoặc bằng cách tạo trình bao bọc phiên của riêng bạn.
Brad

93

Đừng bận tâm, nó là req.session.destroy();


8
Điều này không hiệu quả với tôi trên express 3 .. Tôi đang cố gắng gọi ´req.session.destroy () ´
acidghost

6
Làm việc tốt cho tôi trên ExpressJS 3.00. Được sử dụng req.session.destroy();như acidghost đã làm.
hexacyanide

1
việc sử dụng các req.session.destroy () cũng làm việc cho tôi trong tốc 2,5
TulioPa

1
Tài liệu này ở đâu? Tôi đang cố tìm nó.
huggie

25

Câu hỏi không làm rõ loại cửa hàng phiên nào đang được sử dụng. Cả hai câu trả lời dường như đúng.

Đối với các phiên dựa trên cookie:

Từ http://expressjs.com/api.html#cookieSession

req.session = null // Deletes the cookie.

Đối với các phiên dựa trên Redis, v.v.:

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

1
req.session.destroy về cơ bản là một trình bao bọc để "xóa req.session", hãy xem mã nguồn tại đây: github.com/expressjs/session/blob/master/session/session.js
tfmontague


6

sử dụng,

delete req.session.yoursessionname;

Tôi thực sự muốn xem một tài liệu về điều này.
Lười biếng

5
Đối với tất cả những người bỏ phiếu @Nithin; function-method session.destroy () như được ghi lại trên github (github.com/expressjs/session/blob/master/session/session.js) sử dụng "delete this.req.session" - nó không chính xác là câu trả lời của @ Nithin, nhưng sử dụng "xóa" cũng là một giải pháp đúng (và không được đề cập trong các câu trả lời khác).
tfmontague,

Đây có phải là một trong những giải pháp thích hợp? Không bị rò rỉ bộ nhớ, mọi thứ linh tinh sẽ không xảy ra đúng không?
Rajath

5

Sử dụng req.session = null;, sẽ không thực sự xóa phiên bản. Giải pháp thích hợp nhất sẽ là req.session.destroy();, nhưng đây về cơ bản là một trình bao bọc cho 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 (gọi lại)

Hủy phiên và sẽ hủy đặt thuộc tính req.session. Sau khi hoàn tất, lệnh gọi lại sẽ được gọi.

Cách an toàn ↓ ✅

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

Cách không an toàn ↓ ❌

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

0
req.session.destroy(); 

Ở trên không làm việc cho tôi vì vậy tôi đã làm điều này.

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

Bằng cách đặt thời gian hết hạn của cookie thành thời điểm hiện tại, phiên sẽ tự hết hạn.


-5

Như đã đề cập ở một số nơi, tôi cũng không thể làm cho hàm req.session.destroy () hoạt động chính xác.

Đây là công việc của tôi xung quanh .. dường như làm được thủ thuật và vẫn cho phép sử dụng req.flash

req.session = {};

Nếu bạn xóa hoặc đặt req.session = null; , có vẻ như sau đó bạn không thể sử dụng req.flash


1
Đây là một vấn đề bảo mật, vì nó không thay đổi hàm băm của phiên
Tosh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.