2012-04-18 22 views
5

Jakie byłoby najlepsze podejście do gry! aplikacja do zapamiętania użytkownika? Myślę, że jedynym możliwym rozwiązaniem jest użycie plików cookie po stronie klienta, prawda? Ale jak tylko przeglądarka zostanie zamknięta, sesja zostanie zniszczona i nie będzie obowiązywała dla następnego żądania? Jak to rozwiązałeś (d) to?Przechowuj ciasteczko, nawet jeśli sesja jest zamknięta

Jak na razie, ja Ser ten zakodowane userid w sesji (na sesję), podobnie jak to:

session("userid", user.id); 

I wtedy użyć przechwytujących, aby uniknąć przekazywania parametrów co kiedy trzeba je często, jak to opisano tutaj: How to avoid passing parameters everywhere in play2?

Ale jak zapamiętać użytkownika, a nawet lepiej, automatycznie logować użytkownika na następnej prośbie?

EDYCJA: 2016-03-11 Należy pamiętać, że niektóre przeglądarki mogą przechowywać plik cookie sesji przez dłuższy czas. Na przykład możesz ustawić w Chrome, aby zapamiętać otwarte karty podczas następnej wizyty. Oznacza to, że plik cookie Sesji Play zostanie przywrócony przy następnym otwarciu przeglądarki.

A of Play 2.4 maxAge cookie sesji (trzeba ustawić w application.conf) zostaje zmieniona na: play.http.session.maxAge

+0

można pobrać go z sesji na każde żądanie. Proszę spojrzeć na przykład zentasks, pokazuje jak to wszystko zrobić. –

+1

Spojrzałem na Zentasks, ale sesje zentasks nie trwają, gdy przeglądarka zostaje wyłączona. Chcę zapamiętać użytkownika, kiedy odwiedza go następnego dnia, aby automatycznie zalogować go do aplikacji .. lub czegoś brakuje? – adis

+0

To musi być ustawienie w przeglądarce, ponieważ zazwyczaj pliki cookie nie są usuwane. –

Odpowiedz

0

Jeśli nie wymusić newSession lub użytkownik nie usuwa ciasteczka, użytkownik nadal powinien być zalogowany.

Możliwe, że przeglądarka jest skonfigurowana tak, aby usuwać ciasteczka podczas zamykania lub cierpi na zewnętrzne skutki uboczne. Ale mogę potwierdzić, że pliki cookie pozostają w moim środowisku deweloperskim (zarówno w przeglądarce Chrome, jak i Firefox) po zamknięciu przeglądarki.

+0

i jak utworzyć plik PLAY_SESSION? Ponieważ ten plik cookie (który zawiera mój identyfikator użytkownika jest ważny dla jednej sesji :-( – adis

+0

@adis, Play tworzy to automatycznie, nic co musisz z tym zrobić –

+0

@PereVillega nie jest prawdą, zamknij przeglądarkę i obserwuj swoją sesję do widzenia (Chrome cookie manager "Wygasa: kiedy zamykam przeglądarkę"). To oczywiście również węża przydatnego e-sklepu-użytkownika w scenariuszu z ciasteczkami, aby uniknąć zmuszania użytkownika do ponownego wpisywania adresu e-mail logowania. maszyna do spania i zostawia otwartą przeglądarkę, te, które nie piszą złych zgłoszeń technicznych wsparcia – virtualeyes

1

Cytując Play 2.0 Session Documentation:

Nie ma limitu czasu technicznej dla sesji. Wygasa, gdy użytkownik zamknie przeglądarkę internetową. Jeśli potrzebujesz funkcjonalnego limitu czasu dla konkretnej aplikacji, po prostu przechowuj znacznik czasu w sesji użytkownika i używaj go, jakkolwiek potrzebujesz aplikacji (np. Dla maksymalnego czasu trwania sesji, maksymalnego czasu nieaktywności itd.).

Ze względów bezpieczeństwa, nowoczesne przeglądarki unieważnia ciasteczka na wyjeździe, a to nie jest coś co można zmienić tylko dlatego, że pozwoli ona hakerów do złych rzeczy z poświadczeniami, że nie mają prawnie.

Chciałbym sprawdzić, czy naprawdę naprawdę chce, aby użytkownik się zalogował, ponieważ zwykle jest to zagrożenie dla bezpieczeństwa. Jeśli jednak zdecydujesz, że nadal chcesz, aby użytkownik był zalogowany, będziesz musiał spróbować czegoś, co nie jest oparte na plikach cookie, i na razie nie jestem pewien, jak by to wyglądało.

0

Próbowałem tego i zadziałało to dla mnie. Jest to w zasadzie skomponowana Akcja.

 

def RememberAction(f: Request[AnyContent] => Result): Action[AnyContent] = { 
    Action { request => 
    if(!request.session.get("email").isDefined && request.cookies.get("remember-email").isDefined) { 
     f(request).asInstanceOf[PlainResult].withSession("email" -> request.cookies.get("remember-email").get.value) 
    } else { 
     f(request) 
    } 
    } 
} 

Następnie można użyć tego działania w kontrolerach tak:

 

    def index = RememberAction { implicit request => 
     Ok("Hello World!") 
    } 

5

Aby sesja nie time-out, gdy użytkownik zamyka ich przeglądarki można użyć parametru session.maxAge we wniosku. conf.

np .:

# Set session maximum age in seconds (4w) 
session.maxAge=2419200 
+0

+1, interesujące, byłoby miło, gdybyśmy mogli ustawić to na podstawie danych cookie. Na przykład chciałbym ustawić długi plik cookie użytkownika e-mail z datą wygaśnięcia, ale pozostaw domyślny dla innych scenariuszy. Ustawienie 4-tygodniowej sesji koszyka może być trochę za mało. – virtualeyes

+0

@virtualeyes Threadless trzyma mój wózek na zakupy od miesięcy i lubię to. – Adrien

+0

+1 do session.maxAge - Pamiętaj, że 7d, 1h nie są prawidłowe. – Adrien

Powiązane problemy