2012-01-27 8 views
5

Tengo una aplicación asegurada con un dispositivo y un tiempo de espera de sesión de 30 minutos. Con el dispositivo todo funciona bien para la navegación normal, si el usuario hace clic en un enlace cuando se agota el tiempo de espera, se lo redirecciona a la pantalla de inicio de sesión con un mensaje que dice "Su sesión expiró; vuelva a iniciar sesión para continuar".Mensaje de tiempo de espera de sesión en RoR usando Devise

Sin embargo, tengo ajax en muchos lugares. Si la sesión expira y el usuario realiza una operación Ajax, quiero el mismo comportamiento que el anterior en lugar de fallar silenciosamente con un error 401 en segundo plano.

hasta ahora tengo este código jQuery en cada página para coger 401s y volver a cargar:

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

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

funciona bastante bien, pero no es un problema molesto:

porque la solicitud éxitos ajax idean primera Cuando mi aplicación vuelve a cargar la página me dirigen a la página de inicio de sesión, pero no veo el mensaje de tiempo de espera, veo el mensaje de error "Debes iniciar sesión o registrarte antes de continuar". mensaje.

¿Hay alguna forma de asegurarse de que en el dispositivo de la segunda solicitud aún se muestre el mensaje de tiempo de espera?

Respuesta

2

Creo que debe mostrar este mensaje manualmente, por ejemplo, redirigiendo a una URL específica o estableciendo algún parámetro de consulta.

el problema es que después de su solicitud 401 tiene una nueva sesión y cuando recarga el navegador, la siguiente solicitud golpeará su aplicación con una sesión vacía. por eso recibes el mensaje no autenticado.

1

El mensaje de tiempo de espera "su sesión ha finalizado Por favor, iniciar sesión de nuevo para continuar." Está disponible en xhr.responseText, por lo que una posibilidad sería simplemente mostrar que:

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

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

Para mí esto parece fluir mejor: haga clic Actualice en un formulario Ajax, reciba una alerta de que la sesión ha excedido el tiempo de espera, luego vea "Debe iniciar sesión o registrarse antes de continuar" en el flash en la página de inicio de sesión.

Cuestiones relacionadas