Na minha aplicação tenho um chat que funciona com ajax e javascript, o chat ta funcionando perfeitamente o meu problema é fazer o usuario ficar offline, pq indico que ele esta oline por um campo binary no banco e uma função com ajax fica atualizando… quando o usuario faz o login eu atualizo esse campo fazendo ele ficar com status online ai se o usuario fizer o logout pelo botão sair direitinho ta tudo certo mas QUANDO ELE SAI PELO BOTÃO FECHAR DO NAVEGADOR OU DA ABA, ALT+F4 OU QUALQUER OUTRO MEIO que não seja o botão sair da aplicação ele fica com status online…
Tentar pegar o evento do botão fechar do browser eu ja desisti, ja pesquisei um monte e mta gente ja tentou fazer isso e não da mto certo tentei fazer uma fução com window.onbeforeunload mas tbm não deu mto certo pq qualquar atualização, link, voltar na pagina ela executa…
Em fim, preciso acha uma solução pra executar uma função que realiza um upload no banco antes que o navegardor feche, ou se alguem souber de uma outra solução pra eu tratar esse esquema de usuario online e offline sei lah… talvez pela sessão, mas acho que msm assim o usuario ainda ficaria online até a sessão ser destruída!!
vc pode me ajudar??
Eu sei que vc já tentou usar window.onbeforeunload…
mas vc já tentou, além de passar o status para offline, fechar a sessão? Tudo dentro do tratamento do evento?
Você pode colocar um timeout na session e um Listener, ai quando a session for destruída, fazer o que deseja.
[quote=Rodrigo Vieira Pinto]Eu sei que vc já tentou usar window.onbeforeunload…
mas vc já tentou, além de passar o status para offline, fechar a sessão? Tudo dentro do tratamento do evento?[/quote]
Sim… quando faço o upload tbm ja invalido a sessão… a logica que eu fiz com o onbeforeunload até funcionou pq eu fiz de uma forma que se clicar em qualquer link do sistema não executa (o que é certo) pq eu uso um boolean pra verificar… quando o usuario da um voltar pelo navegador ou atualiza a pagina ele executa o codigo e mata a sessão… (o q não pode acontecer)
segue o codigo que fiz com onbeforeunload…
Script
[code]function Links(){ //função que coloca no onclick de todos os links e botões da pagina a função loadFechar()
var links = document.getElementsByTagName(“a”);
for(var i=0;i<links.length;i++){
var click = links[i].getAttribute(“onclick”);
if((links[i].getAttribute(“id”)!=“no_load”)&&(links[i].getAttribute(“id”)!=“highslide1”)){
if(click!=null){
links[i].setAttribute(“onclick”, "loadFechar(); "+click);
}else{
links[i].setAttribute(“onclick”, “loadFechar();”);
}
}
}
var bts = document.getElementsByTagName(“input”);
for(i=0;i<bts.length;i++){
var bt = bts[i].getAttribute(“type”);
if((bt==“submit”)||(bt==“button”)){
click = bts[i].getAttribute(“onclick”);
if(click!=null){
bts[i].setAttribute(“onclick”, "loadFechar(); "+click);
}else{
bts[i].setAttribute(“onclick”, “loadFechar();”);
}
}
}
}
var sair = true; //variavel que verifica se a pagina esta sendo recarregada por um link dentro da pagina ou não.
function loadFechar(){ //quando clicar em qualquer link da pagina executa essa função e muda a variavel pra false.
sair = false;
}
window.onbeforeunload = function(){
if(sair){ //para os links da pagina funciona perfeitamente, não executa pq “sair” vale false. quando fecha o navegador ela executa fechando a sessão e fazendo o upload o problema é que se atualizar (F5), voltar ou avançar pelo navegador ela executa tbm…
var ajax = openAjax();
ajax.open(“GET”, “LoginControle?metodo=sair”, false);
ajax.send(null);
}
}[/code]
Sevlet LoginControle
else if (metodo.equals("sair")) {
HttpSession sessao = request.getSession();
if(!sessao.isNew()){
PessoaBean usuario = (PessoaBean) sessao.getAttribute("user");
ChatModel Cmodel = new ChatModel();
Cmodel.sair(usuario.getIdPessoa());//executa upload para colocar usuario offline
}
sessao.invalidate(); //invalida sessão
response.sendRedirect("login.jsp?msg=");//quando clica no botão sair redireciona para a tela de login
}
">
Não tenho mto conhecimento sobre Listener mas vou dar uma estudada e ver se da certo, mas ai tbm caio no problema em que se a minha sessão tem 20min pra encerrar o usuario ainda vai ficar com status online o tempo que a sessão ainda estiver ativa…
por exemplo se o usuario entrar no sistema e ja fechar o navegador ele vai ficar como online por praticamente 20min.
ai teria que pensar numa forma de deixar a sessão com um timeout em segundos com algo pra ficar renovando a sessão e quando fechar o navegador ela encerra rapidamente…
o jgbt ja postou algo assim aqui no forum…
[quote=jgbt]2 - Defina um timeout pequeno para a sessão, tipo 10 segundos. Faca um IFrame oculto nas telas que fique fazendo pooling no servidor de 5 em 5 segundos por exemplo para ficar renovando a sessao. Quando o browser for fechado, não havera pooling e em 10 segundos a sessao expira.
Ja postei essas soluções no forum, da uma procurada.[/quote]
não encontrei ainda!! se alguem encontrar me manda o link por favor…
mas vou tentar fazer só com essa idéia que ele deu…
E tem outro problema tbm quanto a ficar renovando a sessão automaticamente… se o usuario deixar o sistema aberto ele nunca vai ser deconectado… a sessão perde parte da sua funcionalidade que é deslogar depois de um tempo inativo!!
que saco, resolve-se um problema e arruma-se outro!!!
já até consegui implementar o listener… mas agora vou cair nesse outro problema…