oi pessoal!
seguinte, antigamente quando eu fazia tudo com servlet e jsp, eu tinha um recurso mto interessante na minha aplicação, um monitor de usuarios logados e no qual tambem era possivel enviar mensagens para eles. os segredos eram tres coisas simples:
-um singleton armazenando os dados da sessao de todos os usuarios
-um listener de session no tomcat pegando todos os dados da sessao dos usuarios de
acordo com os eventos, criacao, atualizacao e fim de sessao e colocando ou retirando do singleton
-um ajax que chamava uma determinada servlet para puxar as mensagens do servidor de 5 em 5 segundos
até aí tudo bem, no Vraptor3 da para fazer com os beans @SessionContext e @ApplicationContext. o problema seria detectar quando a sessao expira. nos listeners do tomcat da para saber, tem um metodo que eh invocado quando isto acontece, pois nao da pra contar sempre com o usuario clicando no botao “Sair” da aplicação, nem com a implementação de um pois vamos supor que o computador da pessoa travou. neste caso ficaria no monitor de usuarios até um reload total da aplicação.
Quanto o tempo da sessao acaba, como faço para saber no Vraptor3?
Será que o bean anotado @SessionContext terá o seu metodo finalize() chamado?
Alquem tem alguma dica?
Ou experiencia para compartilhar?
as anotações do vraptor são @SessionScoped e @ApplicationScoped…
nunca conte com o finalize pra fazer esse tipo de coisa…
se vc colocar um método anotado com @PreDestroy no seu bean session scoped,
ele será rodado, teoricamente, antes de invalidar a sessão…
testei aqui no blank project e funcionou…
então no seu bean @SessionScoped, coloque um método anotado com @PostConstruct
que registra o usuario no repositorio de usuarios logados e um com @PreDestroy que
tira o usuario de lá
Ok! Valeu mesmo cara!
Realmente acabei errando o nome das anotações, kkkk, cheguei em casa com uns chops na cabeça e fui postar no forum, deu nisto. kkkk
Vou fazer do jeito que vc esta indicando.
Abraços!
acho que só faltou uma coisinha, que me esqueci, como pegar o Session ID?
pois era através dela que eu decidia para quem iam as mensagens, adicionava e retirava dados do singleton.
um dos jeitos eh receber um HttpSession no construtor da classe e pegar o session.getId()
Um dos meus grandes desejos no vraptor é de poder remover um objeto de sessão sem precisar injetar o http-session. Mas já quebrei muito a cabeça pensando em uma forma e não cheguei lugar algum. Não consigo ver como fazer isso.
O que estou fazendo no momento para contornar uma aplicação minha que joga ~4mil objetos dentro de um list é que quando acaba o wizard eu faço manualmente um MyObject.clear para limpar a coleção. No caso meu objeto de sessão é apenas uma wrapper que tem uma lista lá dentro.
Pois é, deu certinho injetando a session para pegar o ID, porem concordo com o colega, deveriamos pensar em algo legal para utilizar uma chave de identificação da sessao.
além disto, algum tipo de utilitario no vraptor para obter dados do usuario, como IP, Nome da maquina, Navegador, S.O., etc, sem ficar envonvendo injeção de request por exemplo.
[quote=jeferson.lucio]Pois é, deu certinho injetando a session para pegar o ID, porem concordo com o colega, deveriamos pensar em algo legal para utilizar uma chave de identificação da sessao.
além disto, algum tipo de utilitario no vraptor para obter dados do usuario, como IP, Nome da maquina, Navegador, S.O., etc, sem ficar envonvendo injeção de request por exemplo.[/quote]
Nesse caso eu discordo da necessidade desse tipo de componente. Outro dia o Lucas estava comentando que request e responde são objetos de infra, portanto não há problemas em usa-los em interceptors e outros componentes de infra. Saber IP, navegador e afins é coisa de infra, portando pode ficar tranquilamente em um interceptor.
Há alguns dias publiquei alguma coisa usando ip e navegador em um interceptor para controle de segurança.
O que eu quis dizer é de uma forma de remover objetos na sessão… Atualmente você consegue apenas colocar um objeto na sessão. Para remover é necessário invalidar a session.