2012-01-27 13 views
5

Mam aplikację zabezpieczoną przez programowanie i limit czasu sesji wynoszący 30 minut. Przy opracowywaniu wszystko działa dobrze dla normalnej nawigacji, jeśli użytkownik kliknie na link po przekroczeniu limitu czasu, zostanie przekierowany z powrotem do ekranu logowania z komunikatem "Twoja sesja wygasła, zaloguj się ponownie, aby kontynuować.", Doskonała.Limit czasu sesji w RoR przy użyciu narzędzia Devise

Jednak mam ajax w wielu miejscach. Jeśli sesja zostanie przekroczona, a użytkownik wykona operację ajax, chcę zachować to samo zachowanie, co powyżej, a raczej po cichu z błędem 401 w tle.

tej pory mam ten kod jquery na każdej stronie, aby złapać 401s i przeładować:

$(document).ajaxError(function(e, error) { 
    switch(error.status) { 

    case 401: { 
     // unauthorised (possible timeout) 
     location.reload(); 
     break; 
    } 

To działa dość dobrze, ale nie jest to denerwujące problem:

Ponieważ Ajax żądania odsłon opracować pierwszy , gdy moja aplikacja ponownie załaduje stronę, zostanie przekierowana do strony logowania, ale nie widzę komunikatu przekroczenia limitu czasu, widzę nieuwierzytelnione "Musisz się zalogować lub zarejestrować przed kontynuowaniem." wiadomość.

Czy istnieje sposób, aby na drugiej próbie nadal wyświetlać komunikat o przekroczeniu limitu czasu?

Odpowiedz

2

Uważam, że musisz ręcznie pokazać ten komunikat, na przykład przekierowując do określonego adresu URL lub ustawiając parametr zapytania.

Problem polega na tym, że po żądaniu 401 otrzymałeś nową sesję, a po ponownym wczytaniu przeglądarki kolejne żądanie trafi w aplikację pustą sesją. dlatego otrzymujesz nieuwierzytelnioną wiadomość.

1

komunikat timeout „Sesja wygasła Proszę zalogować się ponownie, aby kontynuować.” Jest dostępna w xhr.responseText, więc jedno podejście byłoby po prostu wyświetlić, że:

$(document).ajaxError(function(e, error) { 
    switch(error.status) { 

    case 401: { 
     // unauthorised (possible timeout) 
     location.reload(); 
     alert(xhr.responseText); 
     break; 
    } 

Dla mnie to wydaje się lepszy przepływ: kliknij Zaktualizuj w formularzu Ajax, uzyskaj alert, że sesja przekroczyła limit czasu, a następnie przeczytaj "Musisz zalogować się lub zarejestrować przed kontynuowaniem" w migawce na stronie logowania.

Powiązane problemy