Melhor maneira de detectar o navegador fechamento / navegação para outra página e fazer o logout
-
23-08-2019 - |
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.
Solução
Looks como GWT tem um evento exatamente para isso.
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;
}
}