วิธีสิ้นสุดเซสชันใน ExpressJS


89

ฉันรู้สึกว่ามันจะต้องถูกฝังไว้ที่ไหนสักแห่งในเอกสาร แต่ฉันหาไม่เจอ

คุณปิดหรือจบหรือฆ่าเซสชัน (อะไรก็ได้) ใน ExpressJS ได้อย่างไร

คำตอบ:


125

คำตอบที่อัปเดต Express 4.x

การจัดการเซสชันไม่ได้รวมอยู่ใน Express อีกต่อไป คำตอบนี้อ้างถึงโมดูลเซสชันมาตรฐาน: https://github.com/expressjs/session

หากต้องการล้างข้อมูลเซสชันเพียงใช้:

req.session.destroy();

เอกสารนี้ไม่มีประโยชน์สำหรับเรื่องนี้ มันบอกว่า:

ทำลายเซสชันลบ req.session จะถูกสร้างขึ้นใหม่ในคำขอถัดไป req.session.destroy(function(err) { // cannot access session here })

นี่ไม่ได้หมายความว่าเซสชันปัจจุบันจะถูกโหลดซ้ำในคำขอถัดไป หมายความว่าเซสชันที่ว่างเปล่าจะถูกสร้างขึ้นในที่เก็บเซสชันของคุณในการร้องขอครั้งต่อไป (น่าจะเป็น ID เซสชันไม่ได้เปลี่ยน แต่ฉันยังไม่ได้ทดสอบ)


มีวิธีทำลายเซสชันจากเซสชันหรือไม่ไม่ใช่การร้องขอในทันที ตัวอย่างเช่นถ้าฉันจะนำฉันออกจากระบบการทำงานของอุปกรณ์ทั้งหมดฉันต้องการสิ่งนั้น
มูฮัมหมัดอูเมอร์

1
@MuhammadUmer เท่าที่ฉันรู้ไม่มีกลไกในตัวสำหรับทำลายเซสชันโดยพลการ คุณสามารถใช้สิ่งนี้ด้วยตัวเองได้อย่างง่ายดายโดยการลบคีย์ที่เกี่ยวข้องกับเซสชันออกจากที่เก็บข้อมูลหรือโดยการสร้างตัวตัดเซสชันของคุณเอง
Brad

94

ไม่เป็นไรมัน req.session.destroy();


8
นี้จะไม่ทำงานสำหรับฉันในด่วน 3 .. ฉันพยายามที่จะ'req.session.destroy โทร () '
acidghost

6
ทำงานได้ดีสำหรับฉันบน ExpressJS 3.00 ใช้req.session.destroy();เป็น acidghost ทำ
hexacyanide

1
การใช้ req.session.destroy () ยังใช้ได้กับฉันใน Express 2.5
TulioPa

1
เอกสารนี้อยู่ที่ไหน? ฉันกำลังพยายามหามัน
huggie

25

คำถามไม่ได้ชี้แจงประเภทของร้านค้าเซสชันที่ใช้อยู่ คำตอบทั้งสองดูเหมือนจะถูกต้อง

สำหรับเซสชันที่ใช้คุกกี้:

จาก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


7

ใช้,

delete req.session.yoursessionname;

ฉันต้องการดูเอกสารเกี่ยวกับเรื่องนี้จริงๆ
Lazy

5
สำหรับทุกคนที่โหวตลง @Nithin; session.destroy () ฟังก์ชั่น - เมธอดตามที่ระบุไว้ใน github (github.com/expressjs/session/blob/master/session/session.js) ใช้ "delete this.req.session" - ไม่ใช่คำตอบของ @ Nithin แต่ การใช้ "ลบ" เป็นวิธีการแก้ปัญหาที่ถูกต้องเช่นกัน (และไม่ครอบคลุมในคำตอบอื่น ๆ )
tfmontague

วิธีนี้เป็นวิธีแก้ปัญหาที่เหมาะสมหรือไม่? ไม่มีการรั่วไหลของหน่วยความจำสิ่งที่ซุกซนจะไม่เกิดขึ้นใช่ไหม?
Rajath

6

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

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;
};

0
req.session.destroy(); 

ข้างต้นไม่ได้ผลสำหรับฉันดังนั้นฉันจึงทำสิ่งนี้

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

ด้วยการตั้งค่าการหมดอายุของคุกกี้เป็นเวลาปัจจุบันเซสชันจะหมดอายุในตัวเอง


-5

ตามที่กล่าวไว้ในหลาย ๆ ที่ฉันยังไม่สามารถรับฟังก์ชัน req.session.destroy () ให้ทำงานได้อย่างถูกต้อง

นี่คือวิธีแก้ปัญหาของฉัน .. ดูเหมือนจะทำเคล็ดลับและยังอนุญาตให้ใช้ req.flash ได้

req.session = {};

ถ้าคุณลบหรือตั้งค่าreq.session = null; ดูเหมือนว่าคุณจะไม่สามารถใช้ req.flash ได้


1
นี่เป็นปัญหาด้านความปลอดภัยเนื่องจากไม่ได้เปลี่ยนแฮชของเซสชัน
Tosh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.