Existe algum macete para se enviar um GET ao servidor Web caso o usuário feche o browser?
Post Mortem
8 Respostas
Talvez de pra fazer um JavaScriptzinho que pega o onClose da janela… mas lembre-se:
- O browser pode nao ter JavaScript habilitado
- A energia eletrica, conexao com a internet ou uma bigorna podem cair (e entao a janela nunca vai ser fechada)
Portanto, use o SessionListener… eh beeeem melhor 
Mas, se mesmo assim você insistir, faça:
<html>
<head>
<script language="javascript">
function doIt( ) {
// do it
}
</script>
</head>
<body onUnload="doIt( );">
</body>
Mas mesmo assim eu acho que não rola, a não ser que você abra um popupzinho com a página que você quer dar GET, e o feche logo em seguida
Falando em Post Mortem tem um site bem loko www.rkpost.net que é de um cara que faz ums desenhos muito loucos para diversos card games, entre eles o mais famoso do mundo Magic: The Gathering
O ZipMail utiliza esse sistema de se abrir um popup para gerenciar os LOGOUTs do site.
Xiii, sempre achei que aquela bigorna podia me trazer problemas! Será que eu terei de tirá-la de cima do servidor?
Sei que vcs devem estar pensando: pra que esse cara fica perguntando esse monte blá-blá-blá? Aprende a tecnologia e não enche mais o saco!
O problema é que eu gosto de saber o que acontece behind the scenes. Sei lá, deve ser paranóia ou um Transtorno Obsessivo Compulsivo do meu lado C++.
Por exemplo, como o servidor sabe que sessão está ativa se na própria definição do http não existe a obrigatoriedade do navegador manter a conexão de rede, mesmo com HTTP 1.1 e keep-alive ? Fiz uns testes com o Internet Explorer e o maledito encerra a conexão após 2 minutos de inatividade, mesmo alterando a opção do registro HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternetSettingsKeepAliveTimeout para, por exemplo, 40 minutos. O Firebird se comportou direitinho e não se desconectou.
Como a SessionListener faz então para reconhecer a presença do usuário? Ela usa uma SessionTarot, SessionMedium ou uma SessionParanormal?
Os servidores normalmente implementam sessão usando session cookies e server-side expiration.
Quando uma sessão é aberta, o servidor manda um cookie pro cliente (SID -> 12345)
Assim sempre que o cliente falar com o servidor ele manda o cookie com o seu SID, 12345, e o servidor tem como associar SID -> sessão.
Mas como o servidor sabe quando uma sessão foi encerada? Programaticamente, quando a aplicação chamar o método invalidate() do objeto Session.
Automaticamente, toda vez que a sessão for referida o servidor quanda o timestamp deste acesso, quando o último acesso for muito antigo a sessão é terminada.
O conteiner só chama a classe que implementa o SessionListener quando o invalidate é chamado(). Se eu colocar um tempo máximo de inatividade e esse tempo for atingido a sessão terminará e o método será invocado? Por exemplo o cara fecha a janela sem efetuar logout onde eu chamo o session.invalidate()…depois da session expirada a classe será invocada?
Pra finalizar, qual a sintaxe correta do listener dentro do web.xml?
<listener>
<listener-class>
getlink.selectmanager.utils.SessionListeners
</listener-class>
</listener>
e vai antes da declaração de qualquer servlet.