Jak opróżnić / zniszczyć sesję w railsach?


Odpowiedzi:


208

Aby wyczyścić całość, użyj metody reset_session w kontrolerze.

reset_session

Oto dokumentacja dotycząca tej metody: http://api.rubyonrails.org/classes/ActionController/Base.html#M000668

Resetuje sesję, usuwając wszystkie przechowywane w niej obiekty i inicjując nowy obiekt sesji.

Powodzenia!


1
W przypadku sesji opartych na bazie danych (których prawdopodobnie powinieneś użyć) możesz wygasnąć za pomocą zapytania: guide.rubyonrails.org/security.html#session-expiry
m33lky

46

sesja w railsach jest obiektem haszującym. Dlatego każda funkcja dostępna do czyszczenia skrótu będzie działać z sesjami.

session.clear

lub jeśli trzeba zniszczyć określone klucze:

session.delete(key)

Testowany na szynach 3.2

dodany

Ludzie, o których wspominali, session={}to zły pomysł. Odnośnie session.clear, komentarze Lobati - Wygląda na to, że prawdopodobnie lepiej jest użyć reset_session [niż session.clear], ponieważ robi to inne czyszczenie poza tym, co robi session.clear. Wewnętrznie reset_session wywołuje session.destroy , co samo w sobie wywołuje clear, a także inne rzeczy.


Czy ktoś ma jakieś przemyślenia na temat zalet tej metody w porównaniu z tą zalecaną przez Gdeglina?
Peter Berg,

3
Można tego użyć, gdy chcesz zachować inne parametry, ale usunąć jedną określoną parę klucz-wartość.
Lavixu,

2
To w ogóle nie zresetuje sesji, przypisze lokalną zmienną. Nigdy nie używaj tej techniki do resetowania sesji: session = {}
alexspeller

4
Dokumentacja Railsów , w sekcji 5.1 Dostęp do sesji, zaleca użycie reset_session, jeśli chcesz usunąć wstawione skrypty pary klucz / wartość (np. Coś wstawionego z kontrolera) i wygenerować nową sesję. Jeśli chcesz zresetować tylko ustawione pary klucz / wartość, ustaw te klucze na zero.
sargas

1
@barlop Wygląda na to, że prawdopodobnie lepiej jest używać reset_session, ponieważ wykonuje inne czyszczenie poza tym, co session.clearrobi. Wewnętrznie reset_sessionpołączeniasession.destroy , które same wywołują clearrównież inne rzeczy .
lobati

7

aby usunąć sesję użytkownika

session.delete(:user_id)

Ostrożnie, możesz usunąć rekord użytkownika z bazy danych!
Arthur

3
@Arthur To nieprawda. Ale usuniesz tylko klucz: user_id z sesji, a nie z całej sesji
Andión

5

Aby wyczyścić tylko niektóre parametry, możesz użyć:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.