4,6. Cierre de una App


4,6. Cierre de una App

Un usuario puede hacer un logout o cerrar la pagina web o el navegador, así la session i la fotografia de la App associada puede finalizar. Cerrar la app puede cer iniciado por los “metodos/logica de la App”. Por lo contrario la session sera cerrada automaticamente cuando la session del servlet haga time-out.


4.6.1. Cerrando una App

Si el usuario cierra la App usando “la zona de interaccion del usuario”, un sucessos devería manejar y usar el codigo “close() - cierr()” en la classe de la App para cerrar la session.

En el siguiente ejemplo, tenemos un botón logout, que finaliza la session del usuario.


Button closeButton = new Button("Logout");

closeButton.addListener(new Button.ClickListener() {
    @Override
    public void buttonClick(ClickEvent event) {
        getMainWindow().getApplication().close();
    } 
});
 
main.addComponent(closeButton);

Boton cerrarBoton = nuevo Boton("Logout");

cerrarBoton.sumaEscuchador(nuevo Boton.ClickEscuchador() {
    @anular
    collectivo vacio botonClick(ClickSucesso sucesso) {
        recibePrincipalVentana().recibeApp().cerrar();
    } 
});
 
principal.sumaPieza(cerrarBoton);

Vas a darte cuenta pronto que cerrando la App simplemente recarga la App con una nueva Fotografia de la App. Puede colocar la ventana para redirigir a una URL diferente (Eso hace que no se recargue la App) con “setLogoutURL - colocarLogoutURL”. Escribe esto en tu classe de la App:


setLogoutURL("/logout.html");

colocaLogoutURL("/logout.html");


4.6.2. Manejando el cierre de la ventana

Cerrando la ventana principal (o todos los niveles-App de ventanas) no cierra la session y la fotografia de la App se va a dejar colgada. Tienes que programar este sucesso manejando los sucessos de cerrar de la ventana.

Si el usuario cierra una ventana del navegador, como seria la ventana principal o cualquier otra nivel-App de ventana, la ventana enviara una solicitud final de AJAX en el Server, que va a “fire-fuego” un “Window.CloseEvent - Ventana.CerrarSucesso”. Puedes manejar el sucesso con un “Window.CloseListener - Ventana.CerrarEscuchador”. En el caso de que el usuario cierre el navegador, el evento es “fired - ejecutado” por cada ventana abierta.


// Close the application if the main window is closed.
main.addListener(new Window.CloseListener(){
   @Override
    public void windowClose(CloseEvent e) {
       System.out.println("Closing the application");
       getMainWindow().getApplication().close();
    } 
});

// Cerrar la App si la ventana principal és cerrada
principal.sumaEscuchador(nueva Ventana.CerrarEscuchador(){
   @MontarEncima
    collectivo vacio ventanaCerrar(CerrarSucesso e) {
       Sistema.fuera.imprimirln("Cerrando la App");
       recibePrincipalVentana().recibeApp().cerrar();
    } 
});

Date cuenta que recargando la ventana quiere decir cerrar i reabrirlo. Por eso, si tienes un manejador de cerrar como el de arriba, el usuario pierde la possibilidad de recargar la ventana del navegador.

De un caso donde el navegador “crashes”, ningun sucesso de cerrar es comunicado al server. I el server no tiene ninguna forma de saber sobre el problema, i la session va a quedar colgada hasta que la session expira con “timeout”. Durante ese tiempo, el usuario puede resetear el navegador, abrir la URL de la App, y la ventana principal va a dirigir al usuario donde se quedó sin conexxion. Esto puede ser un “occurrir” deseado en muchos casos, pero a veces no lo és i puede crear problemas de seguridad.