Melhor maneira de detectar o navegador fechamento / navegação para outra página e fazer o logout

StackOverflow https://stackoverflow.com/questions/888483

Pergunta

Eu estou escrevendo um aplicativo em GWT e eu preciso para detectar quando um usuário navega longe da minha aplicação ou quando ele fecha a janela do navegador (evento onUnload) e fazer um logout (invalidação sessão e algumas outras tarefas de limpeza). A ação de logout é realizada por um servlet.

Atualmente, estou fazendo isso ligando para o evento onUnload () e abrir uma nova janela apontou para o servlet de logout.

Existe uma maneira melhor de fazer isso? Quaisquer outras sugestões são bem vindas.

Foi útil?

Solução

Looks como GWT tem um evento exatamente para isso.

ClosingEvent .

Parece que você precisa para implementar um ClosingHandler

Outras dicas

Porque não basta fazer um cookie de sessão duração muito curta, que é reposto a cada carregamento da página, em seguida, adicione um cookie de rastreamento. Quando o usuário retorna você notar o cookie de rastreamento, mas nenhum cookie de sessão. Expirar a sessão e esclarecer tudo naquele ponto.

pop ups irá impedir a sua sessão se limpo quando se bloqueia a janela aberta onUnload, porque isso é algo que os spammers usam.

Esta é a forma como o evento de encerramento funciona:

Window.addWindowClosingHandler(new Window.ClosingHandler()
{
 @Override
 public void onWindowClosing(ClosingEvent event)
 {
  event.setMessage("Are you sure?");
 }
});

Então GWT dá ao usuário a oportunidade de dizer sim ou não. Claro que você também pode adicionar um teste lá para ver se eles têm os dados não salvos ou o que quiser. Não definindo a mensagem ou defini-lo como nulo não faz nada.

A maneira de fazer isso é usar o Window.addWindowClosingHandler como @Carnell e @BillLyons disse. Mas eu uso uma técnica adicional para detectar se o navegador foi fechado ou se a página está sendo visitado novamente (por atualização ou a navegação de volta).

A seguir há uma classe de utilitário que pode ajudá-lo. Basta ligar as linhas abaixo em sua onModuleLoad para teste.

O exemplo a utilização :

@Override
public void onModuleLoad() {
    if (BrowserCloseDetector.get().wasClosed()) {
        GWT.log("Browser was closed.");
    }
    else {
        GWT.log("Refreshing or returning from another page.");
    }
}

A classe do utilitário :

import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;

public class BrowserCloseDetector {
    private static final String COOKIE = "detector";
    private static BrowserCloseDetector instance;

    private BrowserCloseDetector() {
        Window.addWindowClosingHandler(new Window.ClosingHandler() {
            public void onWindowClosing(Window.ClosingEvent closingEvent) {
                Cookies.setCookie(COOKIE, "");
            }
        });
    }

    public static BrowserCloseDetector get() {
        return (instance == null) ? instance = new BrowserCloseDetector() : instance;
    }

    public boolean wasClosed() {
        return Cookies.getCookie(COOKIE) == null;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top