Como fazer para encerrar a sessão assim que o usuário fechar a janela.

7,159 views
Skip to first unread message

Fabiano Amorim

unread,
Dec 19, 2008, 1:38:24 PM12/19/08
to jav...@googlegroups.com
Quero fazer o seguinte: 

Cada vez que um usuário entra numa área, eu adiciono ele, a um array static, para que o sistema saiba quantas pessoas estão naquela área. Coloquei para que, ao fazer logout, ele fosse removido do array.

Só que o usuário pode não fazer logout normalmente e simplesmente fechar a janela. Aí é que está o problema. A lógica do negócio é que, se ele fechou a janela, então ele abandonou o sistema e sua sessão deverá ser encerrada e tambem removido do array citado.

Alguma sugestão sobre como fazer isso?

--
Ass:

Fabiano Amorim

Bacharelando em Ciência da Computação - UFAL.
Desenvolvedor de sistemas, com especialidade em Java.
Gerente da empresa Proativa Systems, incubada na INCUBAL (Incubadora de empresas de Alagoas).

meu blog sobre empreendedorismo -> fabianoproativa.blogspot.com

Volnei Munhoz

unread,
Dec 19, 2008, 2:24:48 PM12/19/08
to javasf: JavaServer Faces International Group
Olha, já discutimos muito isso aqui na empresa. No entanto não é algo
tão fácil assim. A melhor sugestão que eu poderia te dar é colocar no
evento onUnload do body (recomento fazer isso com o prototype ou
alguma biblioteca JS para garantir o cross-browser) uma chamada para
uma página (window.open) que faz o encerramento da sessão.

Se o controle for só a nivel de saber quem tá logado acho que você
poderia implementar um ServetSessionListener que notifica toda vez que
uma sessão é criada ou destruida.




On 19 dez, 15:38, "Fabiano Amorim" <fabiano.silva.amo...@gmail.com>
wrote:

Fabiano Amorim

unread,
Dec 19, 2008, 2:31:32 PM12/19/08
to jav...@googlegroups.com
O sistema tem de remover ele do array assim que ele fechar o browser.

Gostaria de fazer isso sem mecher no Javascript, até por que não sei mecher. Alguém tem alguma sugestão?

Se não descobrir alguma foram, vou ter de usar javascript mesmo.

valeu aí

2008/12/19 Volnei Munhoz <volnei...@gmail.com>

Volnei Munhoz

unread,
Dec 19, 2008, 2:36:12 PM12/19/08
to javasf: JavaServer Faces International Group
Não quero te desanimar, mas se não for via js não vai ter jeito
mesmo.

E um script muito simples...

<body onunload="window.open('paginaQueFechaASessao.jsf')">
....
</body>

Abraço


On 19 dez, 16:31, "Fabiano Amorim" <fabiano.silva.amo...@gmail.com>
wrote:
> O sistema tem de remover ele do array assim que ele fechar o browser.
> Gostaria de fazer isso sem mecher no Javascript, até por que não sei mecher.
> Alguém tem alguma sugestão?
>
> Se não descobrir alguma foram, vou ter de usar javascript mesmo.
>
> valeu aí
>
> 2008/12/19 Volnei Munhoz <volnei.mun...@gmail.com>

Fabiano Amorim

unread,
Dec 19, 2008, 2:46:21 PM12/19/08
to jav...@googlegroups.com
Bem, se for assim, facilita bastante. Mas se a página fecha a sessão, então tenho de ter algum método que seja executado assim que ela for renderizada certo?

2008/12/19 Volnei Munhoz <volnei...@gmail.com>

Volnei Munhoz

unread,
Dec 19, 2008, 2:52:51 PM12/19/08
to javasf: JavaServer Faces International Group
Normalmente você simplemente remove o atributo que vc verifica pra ver
se a sessão está ativa.

session.removeAttribute("user");

por exemplo.




On 19 dez, 16:46, "Fabiano Amorim" <fabiano.silva.amo...@gmail.com>
wrote:
> Bem, se for assim, facilita bastante. Mas se a página fecha a sessão, então
> tenho de ter algum método que seja executado assim que ela for renderizada
> certo?
>
> 2008/12/19 Volnei Munhoz <volnei.mun...@gmail.com>

Fabiano Amorim

unread,
Dec 19, 2008, 3:21:10 PM12/19/08
to jav...@googlegroups.com
Neste caso, é remover o usuário do array e em seguida, destruir sua sessão.

2008/12/19 Volnei Munhoz <volnei...@gmail.com>

Rafael Rossignol Felipe

unread,
Dec 19, 2008, 3:41:20 PM12/19/08
to jav...@googlegroups.com
VocÊ pode usar um session listener, o problema é que ele só vai remover quando a sessão morrer

Fabiano Amorim

unread,
Dec 20, 2008, 8:14:48 PM12/20/08
to jav...@googlegroups.com
Fiz aqui um teste com esse onunload, mas o que acaba acontecendo é que
ao dar um refresh na tela, ele também carrega a página que faz logout.
Ou seja, o evento ocorre não apenas quando se fecha, mas quando dá um
refresh também e isso não é desejável.

aiaiai, o que eu faço?

Em 19/12/08, Rafael Rossignol Felipe<ogra...@gmail.com> escreveu:
> VocÊ pode usar um session listener, o problema é que ele só vai remover
> quando a sessão morrer
>
> >
>


Fabiano Amorim

unread,
Dec 21, 2008, 7:21:50 AM12/21/08
to jav...@googlegroups.com
ontém fiquei das 22h às 1h da manhã procurando na net uma solução para isso, mas tá complicado demais. Encontrei algumas soluções, mas só funcionam para um browser específico aí não serve. Precisa ser uma solução padrão.

Será possível que não tem um evento tão simples?? algo do tipo onclose??

SE ALGUÉM PUDER DAR UM HELP, AGRADEÇO BASTANTE.

Se houver outro modo que não seja por javascript,agradeço também.


2008/12/20 Fabiano Amorim <fabiano.si...@gmail.com>

Rafael Ponte

unread,
Dec 21, 2008, 9:27:43 AM12/21/08
to jav...@googlegroups.com
É muito complicado saber quando um usuário abandona a página ou mesmo o browser. Mesmo com o evento unload você não tem garantia de nada. O que você pode fazer é diminuir o tempo da sessão do usuário [web.xml], isso não será muito problema pois você estará se utilizando do a4j:poll que mantém as requisições constantes de cada usuário, mantendo-o sempre logado.

Você também poderia dar uma olhada o reverse-ajax do Icefaces ou mesmo do DWR, acredito que poderá te ajudar.

2008/12/21 Fabiano Amorim <fabiano.si...@gmail.com>



--
Rafael Ponte
http://www.rponte.com.br

Fabiano Amorim

unread,
Dec 21, 2008, 9:46:15 AM12/21/08
to jav...@googlegroups.com
pensei em outras soluções:

* será que não tem algum evento que seja executado no momento de apertar o botão X do browser??

* talvez haja um modo de pegar o valor de x e y do mouse, no momento do unload ocorrer, assm, quando o cara apertar o X, o cara verifica se o mouse está no canto superior direito. Acho que essa é a solução mais viável. O problema é que tem de ser uma solução que funcione em qualquer browser. Eu vi como pega a posição do mouse, mas do jeito que vi só funcionava no IE.

* Alguém tem alguma outra solução possível??

2008/12/21 Rafael Ponte <rpo...@gmail.com>

Rafael Ponte

unread,
Dec 21, 2008, 9:52:14 AM12/21/08
to jav...@googlegroups.com
E se a rede cair? E se a energia eletrica acabar? E se o browser ou o OS travar e fechar? E se..
Você não pode se confiar nisso!

2008/12/21 Fabiano Amorim <fabiano.si...@gmail.com>

Fabiano Amorim

unread,
Dec 21, 2008, 10:04:58 AM12/21/08
to jav...@googlegroups.com
tudo bem, concordo que eu não posso lidar com todas as possibilidades, mas eu tenho que pelo menos lidar com a situação do cara apertar no X do browser. Por que é muito comum de o usuário sair sem apertar o botão "sair" do sistema.

Se ele fechar o browser, ele vai continuar na fila e isso não é desejável. Um coisa que pensei agora. Seria possível criar uma janelinha, sem o botão de fechar? ou mesmo desabilitar o botão de fechar, para que ele clique no sair do sistema??

sei que ele poderia usar alt F4 ou qualquer outra coisa, mas se nós removermos o X do browser, já elimina em uns 90% a chance de alguém sair sem clicar no X.

2008/12/21 Rafael Ponte <rpo...@gmail.com>

Thiago Galbiatti Vespa

unread,
Dec 21, 2008, 10:08:01 AM12/21/08
to jav...@googlegroups.com
Você pode colocar um javascript que faça requisições de tempos em tempos no server... se a requisição não for feito dentro de um período, vc fecha a sessão...

Não é uma boa solução, pq vc vai aumentar o tráfego e corre o risco de ao ocorrer problemas de comunicação, fechar a sessão, mas deve funcionar...



2008/12/21 Fabiano Amorim <fabiano.si...@gmail.com>

Fabiano Amorim

unread,
Dec 21, 2008, 10:19:57 AM12/21/08
to jav...@googlegroups.com
mas quem fecha a sessão é o lado servidor. Como vou fazer para que o lado servidor perceba que não chegou uma requisição?

Será que não tem nenhuma função que pegue a posição do mouse, para eu fazer aquela manobra?

2008/12/21 Thiago Galbiatti Vespa <thia...@gmail.com>

Glauco P. Gomes

unread,
Dec 22, 2008, 5:47:25 AM12/22/08
to jav...@googlegroups.com
Mesmo pegando a posicao do mouse, vc tb teria que saber qual a resolucao da tela do usuario, teria que saber se o browser esta maximizado, nao poderia ter nenhuma barra ou painel acima do browser (no Gnome por exemplo, isso é bem comum), se o cara nao colocou outro endereço e navegou para um outro site qualquer, sao muitas condicoes que deveriam ser atendidas, acho que o melhor seria fazer como o Thiago falou, tipo vc coloca a sessao para expirar em 5 min, e coloca um javascript ou um componente qualquer que faca requisicoes de 4 em 4 minutos, entao se passar mais de 5 minutos sem chegar requisicoes no servidor, a sessao do cara acabaria e vc saberia que ele saiu.

Glauco P. Gomes

Fabiano Amorim escreveu:

Jean Michel

unread,
Dec 19, 2008, 2:59:14 PM12/19/08
to jav...@googlegroups.com
Não seria session.invalidade()?



2008/12/19 Volnei Munhoz <volnei...@gmail.com>

Gleber

unread,
Dec 21, 2008, 10:09:33 AM12/21/08
to javasf: JavaServer Faces International Group
Tivemos este problema também, ai fizemos o seguinte.
Nosso index.html (ou jsp) possui dois frames. Um frame com 0 de
tamanho que fica escondido, e outro que ocupa toda área do browser. A
navegação do sistema se dá efetivamente no segundo frame. No frame de
tamanho 0, criamos uma página onde existe o evento onUnload do BODY.
Neste evento, chamamos uma função que, via Ajax, chama um servlet
responsável por limpar a sessão do usuário. Inicialmente abríamos uma
janela do browser que realizava a chamada. Mas dessa forma ficou
melhor.

As páginas do sistema NÃO devem ter o onunload do body, apenas o html
(ou jsp) que fica no frame escondido.

Dessa forma, se vc sair do sistema ou fechar o browser, o onunload
será chamado.

Quanto a energia cair, ai vc fica na mão mesmo, mas tbém não
conseguimos resolver isso. Ai fica por conta do timeout da sessão.

Não sei se fui claro.

[]'s

Gleber

On 21 dez, 12:52, "Rafael Ponte" <rpo...@gmail.com> wrote:
> E se a rede cair? E se a energia eletrica acabar? E se o browser ou o OS
> travar e fechar? E se..
> Você não pode se confiar nisso!
>
> 2008/12/21 Fabiano Amorim <fabiano.silva.amo...@gmail.com>
>
>
>
> > pensei em outras soluções:
> > * será que não tem algum evento que seja executado no momento de apertar o
> > botão X do browser??
>
> > * talvez haja um modo de pegar o valor de x e y do mouse, no momento do
> > unload ocorrer, assm, quando o cara apertar o X, o cara verifica se o mouse
> > está no canto superior direito. Acho que essa é a solução mais viável. O
> > problema é que tem de ser uma solução que funcione em qualquer browser. Eu
> > vi como pega a posição do mouse, mas do jeito que vi só funcionava no IE.
>
> > * Alguém tem alguma outra solução possível??
>
> > 2008/12/21 Rafael Ponte <rpo...@gmail.com>
>
> >> É muito complicado saber quando um usuário abandona a página ou mesmo o
> >> browser. Mesmo com o evento unload você não tem garantia de nada. O que você
> >> pode fazer é diminuir o tempo da sessão do usuário [web.xml], isso não será
> >> muito problema pois você estará se utilizando do a4j:poll que mantém as
> >> requisições constantes de cada usuário, mantendo-o sempre logado.
>
> >> Você também poderia dar uma olhada o reverse-ajax do Icefaces ou mesmo do
> >> DWR, acredito que poderá te ajudar.
>
> >> 2008/12/21 Fabiano Amorim <fabiano.silva.amo...@gmail.com>
>
> >>> ontém fiquei das 22h às 1h da manhã procurando na net uma solução para
> >>> isso, mas tá complicado demais. Encontrei algumas soluções, mas só funcionam
> >>> para um browser específico aí não serve. Precisa ser uma solução padrão.
> >>> Será possível que não tem um evento tão simples?? algo do tipo onclose??
>
> >>> SE ALGUÉM PUDER DAR UM HELP, AGRADEÇO BASTANTE.
>
> >>> Se houver outro modo que não seja por javascript,agradeço também.
>
> >>> 2008/12/20 Fabiano Amorim <fabiano.silva.amo...@gmail.com>
>
> >>> Fiz aqui um teste com esse onunload, mas o que acaba acontecendo é que
> >>>> ao dar um refresh na tela, ele também carrega a página que faz logout.
> >>>> Ou seja, o evento ocorre não apenas quando se fecha, mas quando dá um
> >>>> refresh também e isso não é desejável.
>
> >>>> aiaiai, o que eu faço?
>
> >>>> Em 19/12/08, Rafael Rossignol Felipe<ogrand...@gmail.com> escreveu:

Jean Michel

unread,
Dec 20, 2008, 8:32:08 PM12/20/08
to jav...@googlegroups.com

sergioboni

unread,
Dec 22, 2008, 6:47:54 AM12/22/08
to javasf: JavaServer Faces International Group
Você ainda está esquecendo que todos os browsers modernos utilizam
abas. Então, não da pra saber quando o usuário vai fechar aquela
página específica pela posição do mouse.

On 22 dez, 08:47, "Glauco P. Gomes" <glaucopgo...@yahoo.com.br> wrote:
> Mesmo pegando a posicao do mouse, vc tb teria que saber qual a resolucao da tela do usuario, teria que saber se o browser esta maximizado, nao poderia ter nenhuma barra ou painel acima do browser (no Gnome por exemplo, isso é bem comum), se o cara nao colocou outro endereço e navegou para um outro site qualquer, sao muitas condicoes que deveriam ser atendidas, acho que o melhor seria fazer como o Thiago falou, tipo vc coloca a sessao para expirar em 5 min, e coloca um javascript ou um componente qualquer que faca requisicoes de 4 em 4 minutos, entao se passar mais de 5 minutos sem chegar requisicoes no servidor, a sessao do cara acabaria e vc saberia que ele saiu.
> Glauco P. Gomes
> Fabiano Amorim escreveu:mas quem fecha a sessão é o lado servidor. Como vou fazer para que o lado servidor perceba que não chegou uma requisição?
>
> Será que não tem nenhuma função que pegue a posição do mouse, para eu fazer aquela manobra?2008/12/21 Thiago Galbiatti Vespa<thia...@gmail.com>Você pode colocar um javascript que faça requisições de tempos em tempos no server... se a requisição não for feito dentro de um período, vc fecha a sessão...
> Não é uma boa solução, pq vc vai aumentar o tráfego e corre o risco de ao ocorrer problemas de comunicação, fechar a sessão, mas deve funcionar...2008/12/21 Fabiano Amorim<fabiano.si...@gmail.com>tudo bem, concordo que eu não posso lidar com todas as possibilidades, mas eu tenho que pelo menos lidar com a situação do cara apertar no X do browser. Por que é muito comum de o usuário sair sem apertar o botão "sair" do sistema.
>
> Se ele fechar o browser, ele vai continuar na fila e isso não é desejável. Um coisa que pensei agora. Seria possível criar uma janelinha, sem o botão de fechar? ou mesmo desabilitar o botão de fechar, para que ele clique no sair do sistema??
>
>
>
> sei que ele poderia usar alt F4 ou qualquer outra coisa, mas se nós removermos o X do browser, já elimina em uns 90% a chance de alguém sair sem clicar no X.2008/12/21 Rafael Ponte<rpo...@gmail.com>E se a rede cair? E se a energia eletrica acabar? E se o browser ou o OS travar e fechar? E se..
> Você não pode se confiar nisso!2008/12/21 Fabiano Amorim<fabiano.si...@gmail.com>pensei em outras soluções:
>
> * será que não tem algum evento que seja executado no momento de apertar o botão X do browser??
>
>
>
> * talvez haja um modo de pegar o valor de x e y do mouse, no momento do unload ocorrer, assm, quando o cara apertar o X, o cara verifica se o mouse está no canto superior direito. Acho que essa é a solução mais viável. O problema é que tem de ser uma solução que funcione em qualquer browser. Eu vi como pega a posição do mouse, mas do jeito que vi só funcionava no IE.
>
>
>
> * Alguém tem alguma outra solução possível??2008/12/21 Rafael Ponte<rpo...@gmail.com>É muito complicado saber quando um usuário abandona a página ou mesmo o browser. Mesmo com o evento unload você não tem garantia de nada. O que você pode fazer é diminuir o tempo da sessão do usuário [web.xml], isso não será muito problema pois você estará se utilizando do a4j:poll que mantém as requisições constantes de cada usuário, mantendo-o sempre logado.
> Você também poderia dar uma olhada o reverse-ajax do Icefaces ou mesmo do DWR, acredito que poderá te ajudar.2008/12/21 Fabiano Amorim<fabiano.si...@gmail.com>ontém fiquei das 22h às 1h da manhã procurando na net uma solução para isso, mas tá complicado demais. Encontrei algumas soluções, mas só funcionam para um browser específico aí não serve. Precisa ser uma solução padrão.
>
> Será possível que não tem um evento tão simples?? algo do tipo onclose??
>
>
>
> SE ALGUÉM PUDER DAR UM HELP, AGRADEÇO BASTANTE.
>
>
>
> Se houver outro modo que não seja por javascript,agradeço também.
>
> 2008/12/20 Fabiano Amorim<fabiano.si...@gmail.com>
>
> Fiz aqui um teste com esse onunload, mas o que acaba acontecendo é que
> ao dar um refresh na tela, ele também carrega a página que faz logout.
> Ou seja, o evento ocorre não apenas quando se fecha, mas quando dá um
> refresh também e isso não é desejável.
> aiaiai, o que eu faço?
> Em 19/12/08, Rafael Rossignol Felipe<ogra...@gmail.com> escreveu:> VocÊ pode usar um session listener, o problema é que ele só vai remover
> > quando a sessão morrer
> >
> > >
> >
>
> --
>
> Ass:
> Fabiano Amorim
> Bacharelando em Ciência da Computação - UFAL.
> Desenvolvedor de sistemas, com especialidade em Java.
> Gerente da empresa Proativa Systems, incubada na INCUBAL (Incubadora
> de empresas de Alagoas).
> meu blog sobre empreendedorismo ->fabianoproativa.blogspot.com
>
>
> --
> Ass:
> Fabiano Amorim
> Bacharelando em Ciência da Computação - UFAL.
> Desenvolvedor de sistemas, com especialidade em Java.
> Gerente da empresa...
>
> mais »

Glauco P. Gomes

unread,
Dec 22, 2008, 6:59:30 AM12/22/08
to jav...@googlegroups.com
É mesmo, ainda esqueci desse "pequeno" detalhe, valeu!!!

Glauco P. Gomes

sergioboni escreveu:

Rafael de Paula Souza

unread,
Dec 22, 2008, 7:06:30 PM12/22/08
to jav...@googlegroups.com
Fabiano, o gmail têm esse evento que você está procurando. Experimenta escrever um e-mail e antes de enviar tentar fechar o browser ou a aba.
Não sei como eles fazem, se eu foce você "passava" o firebug nele.

2008/12/22 Glauco P. Gomes <glauco...@yahoo.com.br>



--
Rafael de Paula Souza

Sublimus - Desenvolvimento de Software e Soluções Web.
www.sublimus.com.br

Rafael de Paula Souza

unread,
Dec 22, 2008, 7:11:45 PM12/22/08
to jav...@googlegroups.com
Fiquei curioso e acabei encontrando isso ai:

http://blogs.x2line.com/al/articles/756.aspx

É só testar e usar o <a4j:jsFunction>.

2008/12/22 Rafael de Paula Souza <rafae...@gmail.com>

Fabiano Amorim

unread,
Dec 22, 2008, 11:06:19 PM12/22/08
to jav...@googlegroups.com
li agora mesmo os posts, mas "Rafael de Paula", acho que isso aí não vai funcionar. Esse evento "onbeforeUnload" é praticamente igual ao onunload, se não me engano. Ele ocorre mesmo quando se recarrega a página ou se dá um submit no formulário.

Quanto ao e-mail do Gleber, que ótimo que vc pôde me mandar uma solução. Eu só não entendi muito bem o que vc fez. Amanhã vou dar uma olhada com calma nessa sua solução, até por que nunca mexi com essa tag frame e não sei bem para que ela serve. Vou dar uma lida e ver se entendo a sua solução.

Um comentário: realmente o gmail faz essa verificação, então há um modo de pegar o evento específico de fechar. Tentei usar o firebug, mas o código gerado é tão gigantesco que não tinha como achar a parte que eu quero.

boa noite

Daniel@LG

unread,
Dec 23, 2008, 5:12:38 AM12/23/08
to javasf: JavaServer Faces International Group
E ai galera!

Usa no index.jsp

dentro de tags jsp

session.invalidate();

logo apos redereciona por exemplo para login.jsf!


Abraços!

Fabiano Amorim

unread,
Dec 23, 2008, 1:38:03 PM12/23/08
to jav...@googlegroups.com
sim, mas como através de tags jsp vou saber que o cara fechou a aba?

2008/12/23 Daniel@LG <bel...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 8:08:31 AM3/11/09
to jav...@googlegroups.com
OI pessoal, infelizmente estou ressucitando essa discussão.

Eu terminei praticamente 98% do sistema e esse problema de identificar o fechamento da janela ainda persiste. Já procurei em todas os lugares possíveis, por uma solução, mas até agora nada. Tinha até umas  gambiarras, mas era tudo tão complexo que não dava para entender o que estava sendo feito.

É de extrema importância essa funcionalidade, por que no meu sistema, se uma pessoa fechar a janela e o sistema não identificar isso, vai parecer que ele continua usando. Eu irei cobrar do cliente um valor, de acordo com o quanto ele usar o mesmo. Em alguns casos, vai me dar uma dor de cabeça, pois os meus clientes poderão ser cobrados sem terem usado realmente o sistema. Por isso o fechamento da janela pelo "Xzinho" deve ser identificado ou impedido de acontecer.

um abraço

2008/12/23 Fabiano Amorim <fabiano.si...@gmail.com>
site -> www.proativasystems.com

Rafael Ponte

unread,
Mar 11, 2009, 9:15:46 AM3/11/09
to jav...@googlegroups.com
Dá uma olhada no Reverse Ajax do Dwr, acredito que assim você consiga identificar quando um usuário "fecha" a tal janelinha :))

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>

Handerson Frota

unread,
Mar 11, 2009, 9:21:32 AM3/11/09
to jav...@googlegroups.com
Com tem algumas maneiras de fazer isso...mas com o  Reverse Ajax você resolve isso com mais facilidade.

Acho que podem te ajudar...

http://www.handersonfrota.com.br/reverseajax-dwr-iv-natal-java-day-2008/
http://www.handersonfrota.com.br/reverse-ajax-dwr-comet/

2009/3/11 Rafael Ponte <rpo...@gmail.com>



--
Handerson Frota
Consultor
www.handersonfrota.com.br
www.triadworks.com.br
http://meadiciona.com/handersonbf

Diego Pessoa

unread,
Mar 11, 2009, 10:29:16 AM3/11/09
to jav...@googlegroups.com
Estou com o mesmo problema, Handerson, você possui algum exemplo mais concreto de como seria para ativar este evento via DWR?

2009/3/11 Handerson Frota <hande...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 12:29:49 PM3/11/09
to jav...@googlegroups.com
OI Pessoal, achei essa função do DWR muito exagerada. Isto por que eu tenho de usar mais um framework, por causa de uma única funcionalidade.

Testei a idéia que deram mais acima, sobre usar dois frames. Junto com isso, desabilitei:

* a barra de endereço do navegador (para que ele não vá a outra página).
* Os menus (FIle, Edit, etc...)
* Os botões refresh, voltar, avançar, etc.

    Com isso, as duas únicas situações em que o evento onunload ocorre são: fechamento da janela e teclar F5. Assim só me resta agora desabilitar o F5. Alguém tem alguma sugestão Cross-browser de como fazer isso??

um abraço

2009/3/11 Diego Pessoa <diegop...@gmail.com>

Rafael Ponte

unread,
Mar 11, 2009, 12:32:59 PM3/11/09
to jav...@googlegroups.com
Se a internet cair? Se a rede cair? Se travar a máquina? Se a maquina efetuar um shutdown repentinamente? E se..  :)))

George Queiroz

unread,
Mar 11, 2009, 12:35:25 PM3/11/09
to jav...@googlegroups.com
configura o timeout da aplicação e larga o bicho pegar :D

2009/3/11 Rafael Ponte <rpo...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 12:36:11 PM3/11/09
to jav...@googlegroups.com
Esses casos aí, nem adianta se preocupar com eles. Só quero saber do F5 mesmo, o resto que sabe um dia...

2009/3/11 Rafael Ponte <rpo...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 12:37:26 PM3/11/09
to jav...@googlegroups.com
George, isso não serve de muita coisa, pois pode ser comum alguém ficar 30 min inativo no meu sistema.

2009/3/11 George Queiroz <george...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 12:37:26 PM3/11/09
to jav...@googlegroups.com
George, isso não serve de muita coisa, pois pode ser comum alguém ficar 30 min inativo no meu sistema.

2009/3/11 George Queiroz <george...@gmail.com>
configura o timeout da aplicação e larga o bicho pegar :D

Fabiano Amorim

unread,
Mar 11, 2009, 12:40:15 PM3/11/09
to jav...@googlegroups.com
Preciso resolver só mais essa do F5. Já imaginou o transtorno quando o cara aperta F5 e aparece "sua sessão foi encerrada"

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>

George Queiroz

unread,
Mar 11, 2009, 12:41:26 PM3/11/09
to jav...@googlegroups.com
dependendo da situação, ele deveria logar novametne.
 
mais não conheço processo

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>

Rafael Ponte

unread,
Mar 11, 2009, 12:48:34 PM3/11/09
to jav...@googlegroups.com
Sem algum tipo de conexão ponto-a-ponto é muito complicado saber que o usuário deslogou/saiu da aplicação. Por melhor que sejam as gambiarras ainda assim serão falhas em determinados pontos.

Por isso sugeri o Reverse-Ajax do DWR. Contudo, vale a pena uma lida na documentação do mesmo sobre o assunto para maiores detalhes.

2009/3/11 George Queiroz <george...@gmail.com>

Handerson Frota

unread,
Mar 11, 2009, 1:02:46 PM3/11/09
to jav...@googlegroups.com
Diego cara é mais ou menos assim.

Aqui vc pega todas as páginas que estão conectadas(sessão) ao servidor.

Collection<ScriptSession> sessions = serverContext.getScriptSessionsByPage("/ReverseAjaxDWR/jsp/usuario/indexUsuario.jsp");
                ScriptProxy proxy = new ScriptProxy(sessions);

for(ScriptSession sessao : sessions){
....
}

com isso vc pode fazer o que quiser. A partir dessa sessão vc pode pegar o usuário que está nela.
Se por exemplo, um exemplo bem simples mesmo, só para ter uma idéia.

Vc tem uma colection de 20 paginas(sessões) ou seja, usuários. Se em um determinado momento estiver com 19, quer dizer que um cara saiu, não importa como, fechou, travou a maquina, deu F5, faltou energia, bomba nuclear.... vc irá saber quem saiu.

Não tenho um exemplo específico deste problema, mas entendendo o conceito é possível fazer o que você quer.

Abraços

2009/3/11 Diego Pessoa <diegop...@gmail.com>

Handerson Frota

unread,
Mar 11, 2009, 1:07:51 PM3/11/09
to jav...@googlegroups.com
"OI Pessoal, achei essa função do DWR muito exagerada. Isto por que eu tenho de usar mais um framework, por causa de uma única funcionalidade."

Vc precisa adicionar um dwr.jar de 402kb + dwr.xml, e um trecho no web.xml que ele já te dá , pronto já colocou o framework. Tudo bem, adicionar um framework mesmo que simples e pequeno para resolver uma funcionalidade pode ser "exagerada". Acho que não. A não ser que você prefira fazer do zero a solução e ainda ter riscos de bugs, pois com certeza vc não terá o tempo que o DWR por exemplo teve de testes e testes.


"
* a barra de endereço do navegador (para que ele não vá a outra página).
* Os menus (FIle, Edit, etc...)
* Os botões refresh, voltar, avançar, etc."

Fico imaginando a quantidade de coisas que vc deve ter feito para fazer isso, sem falar em usar iframe, que ao meu ver, não é lá uma boa solução, principalmente para manter a manutenção.

Bem, só sugeri a solução, cada um faz o que acha melhor ;) não sou eu que vai dizer qual é a melhor para o seu sistema.


Abraços e boa sorte.

Fabiano Amorim

unread,
Mar 11, 2009, 1:22:28 PM3/11/09
to jav...@googlegroups.com
Realmente acho um exagero usar um framework, mesmo que pequeno, para resolver um único problema e ainda acho que talvez não venha a resolver. Isto por que, de acordo com o que vc falou (veja abaixo), ele vai saber quais são as páginas atualmente usadas, mas será que dá para identificar que o usuário fechou a janela, por exemplo, em até 30 segundos?? Pode ser que até dê certo, só não sei se é uma boa opção.


"Vc tem uma colection de 20 paginas(sessões) ou seja, usuários. Se em um determinado momento estiver com 19, quer dizer que um cara saiu, não importa como, fechou, travou a maquina, deu F5, faltou energia, bomba nuclear.... vc irá saber quem saiu."

Quanto a desabilitar os itens abaixo, é bem simples de se fazer, é só usar os atributos do método window.open();


* a barra de endereço do navegador (para que ele não vá a outra página).
* Os menus (FIle, Edit, etc...)
* Os botões refresh, voltar, avançar, etc."

Com isso, os dois únicos eventos onde o onunload ocorre são: fechar janela e F5. Por isso, só preciso saber como desabilito o F5 agora e o meu problema está resolvido. As situações em que o "onunload" ocorre, caíram de umas 10 para somente 2. Quero deixar em uma só.

Deculpem se fui rude em qualquer momento.

um abraço

2009/3/11 Handerson Frota <hande...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 3:49:59 PM3/11/09
to jav...@googlegroups.com
Se não for possível desabilitar o refresh, pelo menos gostaria de acionar uma função, cada vez em que uma tecla for pressionada. Aí se for o F5, não executa a ação, só isso eu quero. Encontrei dezenas de posts em fóruns, mas as soluções só funcionam no IE ou funciona no FF e não no IE.

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>

Rodrigo Galba

unread,
Mar 11, 2009, 4:04:40 PM3/11/09
to jav...@googlegroups.com
só uma idéia, eu acho que o protocolo HTTPS cria uma conexão direta com o cliente, de forma a saber quando ele esta conectado...

Acho que alguma API que trate disso pode te ajudar.

Realmente não conheço, mas acho que seria um caminho a seguir... :P

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>



--
--------------------------------------------
Rodrigo Galba
Java Developer

Handerson Frota

unread,
Mar 11, 2009, 4:09:17 PM3/11/09
to jav...@googlegroups.com
"Realmente acho um exagero usar um framework, mesmo que pequeno, para resolver um único problema e ainda acho que talvez não venha a resolver. Isto por que, de acordo com o que vc falou (veja abaixo), ele vai saber quais são as páginas atualmente usadas, mas será que dá para identificar que o usuário fechou a janela, por exemplo, em até 30 segundos??"

É ReverseAjax ou seja, utiliza-se do COMET. Então não dá para vc ver em 30 segundos e sim em tempo real...a conexão fica aberta, ele tem vários tipos vc pode olhar no meu site: http://www.handersonfrota.com.br/reverse-ajax-dwr-comet/


"Deculpem se fui rude em qualquer momento."

Sem stress ;)


Mas tudo bem cara, foi apenas uma idéia ;) abraços.

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>

Handerson Frota

unread,
Mar 11, 2009, 4:10:08 PM3/11/09
to jav...@googlegroups.com
Só refazendo aqui...

É ReverseAjax ou seja, utiliza-se do COMET. Então não dá para vc ver em 30 segundos apenas e sim em tempo real se preferir, ou em x segundos, vc escolhe...a conexão fica aberta, ele tem vários tipos vc pode olhar no meu site: http://www.handersonfrota.com.br/reverse-ajax-dwr-comet/

2009/3/11 Handerson Frota <hande...@gmail.com>

André Moreira

unread,
Mar 11, 2009, 6:36:48 PM3/11/09
to jav...@googlegroups.com
@Fabiano

Procura por HttpSessionListener.
Senão me engano na edição atual da revista Mundo Java, o Décio demonstra uns exemplos de como trabalhar com as Listeners do Servlert.
Acredito que isso possa ajudar você, de qualquer forma aí vai o código...

public class SessionListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent event) {
// TODO
}

public void sessionDestroyed(HttpSessionEvent event) {
// TODO
}

}

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>



--
Grato.
André Moreira
GTalk: mou...@gmail.com
Portfólio: http://mourdok.awardspace.com
Celular: +55 (11) 8568-0902
Skype: mourdok1985

"Software não é ouro, é alface: um bem perecível. Se não for aprimorado ao longo do tempo, acaba estragando.", Brian Behlendorf.

Fabiano Amorim

unread,
Mar 11, 2009, 9:12:39 PM3/11/09
to jav...@googlegroups.com
oi André, 

Talvez essa solução não funcione, por que (se entendi direito) essa classe verifica se a sessão foi encerrada e quando o usuário fecha a janela, a sessão não se encerra, então essa solução não pegará o momento do fechamento.

2009/3/11 André Moreira <mou...@gmail.com>

Fabiano Amorim

unread,
Mar 11, 2009, 9:26:36 PM3/11/09
to javasf


---------- Forwarded message ----------
From: Fabiano Amorim <fabiano.si...@gmail.com>
Date: 2009/3/11
Subject: Re: [javasf] Re: Como fazer para encerrar a sessão assim que o usuário fechar a janela.
To: "Carlos Delfino (Java)" <cdcp...@gmail.com>


    A página em que deve ser identificado o "fechamento" é atualizada a cada 20 segundos. Eu poderia até fazer algo do tipo: "se não for feita uma atualização em 2 minutos, significa que ele talvez tenha fechado o navegador". Porém, pode ser que a internet tenha caído momentaneamente.

    Outra coisa, o meu sistema é um sistema de atendimento ao cliente. O usuário é cobrado por cada atendimento realizado e o desconto dos créditos é feito no momento em que o atendente chama o cara para ser atendido. Imagine que o atendente chama alguém para ser atendido que já fechou a sua janela. Nesse caso, o crédito é descontado e não haverá ninguém do outro lado. Imagine se isso acontecer umas 10, 15 ou 30 vezes no mês, será um bom dinheiro perdido pelo cliente e uma dose grande de reclamações sobre o sistema.

    Por esses motivos, preciso identificar o fechamento da janela, para que eu retire a pessoa da fila de espera e remova a sessão dela, evitando problemas para o cliente e para mim.

um abraço


2009/3/11 Carlos Delfino (Java) <cdcp...@gmail.com>
so para completar, use todos os demais eventos do JavaScript que lhe for interessante para desativar o componente push quando tiver que parar de monitorar a seção do cliente.

2009/3/11 Carlos Delfino (Java) <cdcp...@gmail.com>

Fabiano!

Bom Dia! (Ou boa noite)

Estive pensando em seu problema e como eu o resolveria se estive se diante dele, sem usar um novo framework!

Pensei se poderia usar o componente A4J Push do RichFaces(http://livedemo.exadel.com/richfaces-demo/richfaces/push.jsf) para manter um contato periódico com o servidor.

Portanto, teria que determinar um tempo minimo de existência da seção, poderia chamar este tempo de carência, se dentro deste prazo a pagina não mais acionar o ciclo do push conforme se pode determinar no próprio componente, ele considera que o usuário não está mais usando a aplicação.

A cada ciclo do push, ele pode por exemplo obter em seu sistema quanto tempo ainda lhe resta, ou mesmo o quanto lhe está custando a seção até agora.

O próprio exemplo existente no link http://livedemo.exadel.com/richfaces-demo/richfaces/push.jsf pode ser facilmente adaptado para este algoritmo sugerido acima.

Boa sorte.
por gentileza, me confirme se esta seria uma solução ou não para seu problema


2009/3/11 André Moreira <mou...@gmail.com>



--
Carlos Delfino (ad...@full.srv.br)
Full Service Consultoria e Serviços
http://www.full.srv.br
---

Infra Estrutura para Redes de Computadores
Desenvolvimento de Softwares Especializados
Desenvolvimento de Sites Especializados



--
Carlos Delfino (ad...@full.srv.br)
Full Service Consultoria e Serviços
http://www.full.srv.br
---

Infra Estrutura para Redes de Computadores
Desenvolvimento de Softwares Especializados
Desenvolvimento de Sites Especializados



--
Ass: Fabiano Amorim

Bacharelando em Ciência da Computação - UFAL.
Desenvolvedor de sistemas, com especialidade em Java.
Gerente da empresa Proativa Systems, incubada na INCUBAL (Incubadora de empresas de Alagoas).
site -> www.proativasystems.com

meu blog sobre empreendedorismo -> fabianoproativa.blogspot.com

Carlos Delfino (Java)

unread,
Mar 11, 2009, 9:11:16 PM3/11/09
to jav...@googlegroups.com, fabiano.si...@gmail.com
Fabiano!

Bom Dia! (Ou boa noite)

Estive pensando em seu problema e como eu o resolveria se estive se diante dele, sem usar um novo framework!

Pensei se poderia usar o componente A4J Push do RichFaces(http://livedemo.exadel.com/richfaces-demo/richfaces/push.jsf) para manter um contato periódico com o servidor.

Portanto, teria que determinar um tempo minimo de existência da seção, poderia chamar este tempo de carência, se dentro deste prazo a pagina não mais acionar o ciclo do push conforme se pode determinar no próprio componente, ele considera que o usuário não está mais usando a aplicação.

A cada ciclo do push, ele pode por exemplo obter em seu sistema quanto tempo ainda lhe resta, ou mesmo o quanto lhe está custando a seção até agora.

O próprio exemplo existente no link http://livedemo.exadel.com/richfaces-demo/richfaces/push.jsf pode ser facilmente adaptado para este algoritmo sugerido acima.

Boa sorte.
por gentileza, me confirme se esta seria uma solução ou não para seu problema


2009/3/11 André Moreira <mou...@gmail.com>
@Fabiano

Carlos Delfino (Java)

unread,
Mar 11, 2009, 9:14:07 PM3/11/09
to jav...@googlegroups.com, fabiano.si...@gmail.com
so para completar, use todos os demais eventos do JavaScript que lhe for interessante para desativar o componente push quando tiver que parar de monitorar a seção do cliente.

2009/3/11 Carlos Delfino (Java) <cdcp...@gmail.com>
Fabiano!

Carlos Delfino (Java)

unread,
Mar 11, 2009, 9:39:28 PM3/11/09
to jav...@googlegroups.com
use um token, poderia ser um UUID para identificar a seçào, quando a internet voltar, este uuid será sempre unico, então não terá problemas se a NET cair!

2009/3/11 Fabiano Amorim <fabiano.si...@gmail.com>

Rafael Rossignol Felipe

unread,
Mar 12, 2009, 7:42:56 AM3/12/09
to jav...@googlegroups.com
Eu usei aqui um session listener para gravar quando o cara fez o último clique na aplicação. Dentro do session listener da pra saber isso, a data da pra saber

public void sessionDestroyed(HttpSessionEvent sessionEvent) {
sessionEvent.getSession().getLastAccessedTime()
}

sei lá, pode ser útil, da pra saber quanto tempo o cara ficou logado, pois essa é a data da última iteração do cara

você pode utilizar isso em conjunto com um javascript genérico colocado em cada uma das páginas, que no evento de fechar, abre uma outra janela simples de uma página vazia que se fecha sozinha, pra que isso?
pois vai acabar coincidindo que essa data é a data de saída, porém ela só vai ser gravada no banco (ou sejá la o que você vá fazer) quando a sessão morrer de verdade (dali 30 minutos se for o default).

_________________________________
http://rafaelrossignol.wordpress.com/
http://paramudarobrasil.wordpress.com/

Fabiano Amorim

unread,
Mar 12, 2009, 8:27:57 AM3/12/09
to jav...@googlegroups.com
Muito obrigado pelas contribuições pessoal. Acho que vou refazer a discussão em outro e-mail, do ponto do F5 mesmo, alguma solução para impedir de apertar o F5, ou interceptar o evento e não deixar ele fazer alguma coisa. Quero fazer isso em uma única página do sistema. No restante dá para resolver isso de outros modos. Nessa página tem de ser identificado rapidinho o problema.

2009/3/12 Rafael Rossignol Felipe <ogra...@gmail.com>

Fabiano Amorim

unread,
Mar 12, 2009, 8:28:35 AM3/12/09
to jav...@googlegroups.com
quero dizer, identificar o evento de fechamento

2009/3/12 Fabiano Amorim <fabiano.si...@gmail.com>
Reply all
Reply to author
Forward
0 new messages