จะล้าง / ทำลายเซสชันในรางได้อย่างไร?


136

ฉันไม่พบที่ใดเลย ... ฉันจะลบ / ทำลาย / รีเซ็ต / ว่างเปล่า / ล้างเซสชันของผู้ใช้ใน Rails ได้อย่างไร ไม่ใช่แค่คุณค่าเดียว แต่คือสิ่งทั้งหมด ..

คำตอบ:


208

หากต้องการล้างข้อมูลทั้งหมดให้ใช้วิธีการ reset_session ในคอนโทรลเลอร์

reset_session

นี่คือเอกสารเกี่ยวกับวิธีนี้: http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

รีเซ็ตเซสชันโดยการล้างอ็อบเจ็กต์ทั้งหมดที่เก็บอยู่ภายในและเตรียมใช้งานวัตถุเซสชันใหม่

โชคดี!


1
สำหรับเซสชันที่ใช้ฐานข้อมูล (ซึ่งคุณควรใช้) คุณสามารถหมดอายุได้ด้วยการสอบถาม: guide.rubyonrails.org/security.html#session-expiry
m33lky

46

เซสชันในรางเป็นวัตถุแฮช ดังนั้นฟังก์ชันใด ๆ ที่มีให้สำหรับการล้างแฮชจะทำงานร่วมกับเซสชัน

session.clear

หรือหากต้องทำลายคีย์เฉพาะ:

session.delete(key)

ทดสอบในราง 3.2

เพิ่มแล้ว

ผู้คนกล่าวถึงโดยsession={}เป็นความคิดที่ไม่ดี เกี่ยวกับsession.clearความคิดเห็นของ Lobati ดูเหมือนว่าคุณน่าจะดีกว่าในการใช้ reset_session [กว่า session.clear] เนื่องจากเป็นการล้างข้อมูลอื่น ๆ นอกเหนือจากที่ session.clear ทำ ภายใน reset_session เรียก session.destroy , ที่ตัวเองเรียกร้องที่ชัดเจนเช่นเดียวกับบางสิ่งอื่น ๆ


ใครมีความคิดเกี่ยวกับข้อดีของวิธีนี้กับวิธีที่ Gdeglin แนะนำบ้างไหม?
Peter Berg

3
สามารถใช้เมื่อคุณต้องการคงพารามิเตอร์อื่น ๆ ไว้ แต่จะลบคู่ค่าคีย์เฉพาะหนึ่งคู่
Lavixu

2
การดำเนินการนี้จะไม่รีเซ็ตเซสชันเลย แต่จะกำหนดตัวแปรท้องถิ่น อย่าใช้เทคนิคนี้เพื่อรีเซ็ตเซสชัน: session = {}
alexspeller

4
เอกสารทางรถไฟในส่วน5.1 การเข้าถึงเซสชันแนะนำให้ใช้ reset_session ถ้าคุณต้องการลบสคริปต์แทรกคีย์ / คู่ค่า (เช่น: บางสิ่งบางอย่างแทรกจากตัวควบคุม) และสร้างเซสชันใหม่ หากคุณต้องการรีเซ็ตเฉพาะคู่คีย์ / ค่าที่คุณตั้งไว้ให้ตั้งค่าคีย์เหล่านั้นเป็นศูนย์
sargas

1
@barlop ดูเหมือนว่าคุณน่าจะใช้งานได้ดีกว่าreset_sessionเพราะมันทำความสะอาดอื่น ๆ นอกเหนือจากสิ่งที่session.clearทำ ภายในreset_sessionเรียกsession.destroyซึ่งตัวเองเรียกร้องclearเช่นเดียวกับบางสิ่งอื่น
lobati

7

เพื่อลบเซสชันของผู้ใช้

session.delete(:user_id)

ระวังคุณสามารถลบบันทึกผู้ใช้ออกจากฐานข้อมูล!
Arthur

3
@ อาเธอร์นั่นไม่จริง แต่คุณจะลบเฉพาะคีย์: user_id จากเซสชันไม่ใช่ทั้งเซสชัน
Andión

5

หากต้องการล้างเฉพาะบางพารามิเตอร์คุณสามารถใช้:

[:param1, :param2, :param3].each { |k| session.delete(k) }

2

เพิ่มรหัสนี้ใน ApplicationController ของคุณ

def reset_session
  @_request.reset_session
end

(ไม่รู้ว่าทำไมไม่มีใครพูดถึงรหัสนี้เพราะมันแก้ปัญหาของฉันได้) http://apidock.com/rails/ActionController/RackDelegation/reset_session


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