2010-09-17 8 views
7

Estoy construyendo una aplicación web usando Tapestry en combinación con Spring Security y la biblioteca jQuery además de Prototype. Cuando un usuario hace clic en un enlace después de que se agotó el tiempo de espera de la sesión, se le redirige automáticamente a la página de inicio de sesión. Esto, por supuesto, no funciona para los enlaces, que desencadenan una solicitud de AJAX.Tiempo de espera de la sesión Error AJAX en la aplicación Tapestry

Lo sé, este es un problema común con cualquier tipo de aplicación web (por ejemplo, http://www.openjs.com/articles/ajax/session_timeout.php). ¿Existe una solución de mejores prácticas para Tapestry 5?

EDITAR la siguiente solución (gracias a Henning) funciona para mí:

Ajax.Responders.register(
{ 
    onException: function() 
    { 
     window.location.reload(); 
    } 
}); 

En caso de un fallo durante una AJAX-llamar a una recarga de la página se activa, lo que en consecuencia redirige al inicio de sesión -página. Todavía necesita algo de ajuste (por ejemplo, mostrar un mensaje de error en lugar de redirigir), pero usar Ajax.Responders básicamente parece una buena manera de hacerlo.

+0

haga lo que el autor sugiere en el artículo. encontrarlo desde javascript. – Adeel

+1

Simplemente volver a cargar la página es una solución muy elegante; Haré que sea el nuevo predeterminado para mis aplicaciones. ¡Gracias! – Henning

Respuesta

4

Para el AJAX que usa Prototype, puede agregar un detector global que reaccione a las fallas AJAX usando AJAX.Responders; jQuery tiene una construcción similar llamada Ajax Events que puede usar.

Ambos controladores de eventos solo deben redirigir a la página de inicio de sesión en un error 403. Puede crear un mixin con esta funcionalidad y agregarlo a su componente de diseño.

También he usado un mecanismo que evita tiempos de espera de sesión mientras la aplicación todavía está abierta en una ventana del navegador simplemente haciendo una llamada AJAX y recibiendo una respuesta vacía cada par de minutos, manteniendo así la sesión abierta. Estúpido, pero funciona bien.

+0

Gracias por señalar AJAX.Responders. Esto funciona muy bien! – martin

0

Bien, la solicitud de Ajax se realiza al servidor y envía el encabezado "HTTP_X_REQUESTED_WITH" con el valor "XMLHttpRequest". Puede comprobar en el servidor si se trata de una solicitud ajax con el encabezado anterior y la condición para el inicio de sesión y el tiempo de espera de la sesión antes de continuar en su página de índice.

Si sus criterios coinciden, simplemente imprima "window.top.location.href = 'página de inicio de sesión' 'en su función.

En PHP que puedo hacer esto como,

<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check){ 
    echo "<script>window.top.location.href='login.php'</script>"; 
    } 

?> 

Puede agregar condiciones similares a las que en su marco.

3

puede contribuir al despachador maestro T5

 

public class AjaxAccessController implements Dispatcher { 

    @Override 
    public boolean dispatch(Request request, Response response) throws IOException { 

     // Si no hay session y la petición es ajax, recargar la página 
     Session session = request.getSession(false); 
     if (session == null && request.isXHR()) { 
      OutputStream os = response.getOutputStream("application/json;charset=UTF-8"); 
      os.write("{\"script\":\"window.location.reload();\"}".getBytes()); 
      os.flush(); 
      return true; 
     } 

     return false; 
    } 
} 
 

En su AppModule.java

 

public static void bind(ServiceBinder binder) { 
     // binder.bind(MyServiceInterface.class, MyServiceImpl.class); 
     // Make bind() calls on the binder object to define most IoC services. 
     // Use service builder methods (example below) when the implementation 
     // is provided inline, or requires more initialization than simply 
     // invoking the constructor. 

     // Id de AjaxAccessController 
     binder.bind(AjaxAccessController.class).withId("AjaxAccessController"); 
    } 

public void contributeMasterDispatcher(
      OrderedConfiguration configuration, 
      @InjectService("AjaxAccessController") Dispatcher accessController) { 

     configuration.add("AjaxAccessController", accessController, "before:ComponentEvent"); 
    } 
 

por lo que cada petición Ajax y sin sesión, la página se vuelve a cargar y se redirige a su página de índice

+0

Esto no funcionó para mí en Tapestry 5.3.7. En cambio, utilicé ComponentRequestFilter para hacer lo que hice en el Dispatcher. –

Cuestiones relacionadas