2012-01-27 8 views
5

Ho un'applicazione protetta con devise e un timeout di sessione di 30 minuti. Con l'idea tutto funziona bene per la normale navigazione, se l'utente fa clic su un link quando è scaduto viene reindirizzato alla schermata di accesso con un messaggio che dice "La tua sessione è scaduta, accedi nuovamente per continuare.", Eccellente.Messaggio di timeout sessione in RoR utilizzando Devise

Tuttavia ho ajax in molti posti. Se la sessione scade e l'utente esegue un'operazione ajax, desidero lo stesso comportamento di cui sopra piuttosto che fallire silenziosamente con un errore 401 in background.

Finora ho questo codice jQuery in ogni pagina per catturare 401S e ricaricare:

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

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

funziona abbastanza bene, ma c'è un problema fastidioso:

Perché i colpi richiesta AJAX elaborare prima , quando la mia applicazione ricarica la pagina, vengo indirizzato alla pagina di accesso, ma non vedo il messaggio di timeout, vedo la persona non autenticata "È necessario accedere o registrarsi prima di continuare." Messaggio.

Esiste un modo per garantire che nella seconda richiesta di installazione venga ancora visualizzato il messaggio di timeout?

risposta

2

Penso che sia necessario mostrare manualmente questo messaggio, ad esempio reindirizzando a un URL specifico o impostando qualche parametro di query.

il problema è che dopo la richiesta 401 hai una nuova sessione e quando ricarichi il browser, la richiesta successiva colpirà la tua applicazione con una sessione vuota. ecco perché ottieni il messaggio non autenticato.

1

Il messaggio di timeout "La tua sessione scaduto Accedi nuovamente per continuare." È disponibile in xhr.responseText, così uno approccio sarebbe quello di visualizzare proprio questo:

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

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

A me questo sembra fluire meglio: clicca Aggiornamento su un modulo Ajax, ottenere un avviso che la sessione è scaduta, quindi vedere "È necessario accedere o registrati prima di continuare" nel flash sulla pagina di accesso.

Problemi correlati