Acredito que o ideal seria utilizar o escopode aplicação para preservar as informações de usuário “logados”, isso no momento em que você autenticar o mesmo, incremente um contador alocado na Application.
Detalhe, dependendo da necessidade você poderia colocar na Application (escopo) um List inserindo no login e removendo no logout!
O problema é que você não tem como saber quando um usuário sai do sistema se ele não clicar no botõa logout.
Neste caso seu contador so iria decrementar quando a sessão deste usuário expirar.
[quote=Oenning]O problema é que você não tem como saber quando um usuário sai do sistema se ele não clicar no botõa logout.
Neste caso seu contador so iria decrementar quando a sessão deste usuário expirar.[/quote]
Isso mesmo, foi o que pensei.
E outra, quando expirar a sessão do usuário, como capturar isso no Filter pra decrementar o list??
você pode definir um tempo curto para a sessão (1 min por exemplo) e colocar um mecanismo de “keep-alive” no seu sistema…
procure no source do html aqui do guj um iframe apontando para a página /ping_session.jsp.
(teve um tópico comentando sobre isso essa semana)
com isso, se o usuário fechar o browser, a sessão morrerá sozinha.
precisará ter um controle a mais para não existir duas sessões para o mesmo usuário…
Eu fazia mais ou menos isso, mas deixei a sessão em 30 minutos e removi o ping. Expliquei para o administrador do sistema que aquela é uma quantidade APROXIMADA de usuários online.
Se você precisa de uma quantidade EXATA, essa solução do ping é legal
Ok, mas se o ping falhar, você vai perder a sessão? Imagina acontecer isso umas 10 vezes por dia, o usuário vai ficar louco.
O problema de deixar uma sessão longa é que você acaba desperdiçando recursos.
Imagine por exemplo, se você tem uma aplicação que o perfil padrão do usuário é: loga, faz uma operação de 10 segundos e sai (sem deslogar).
Considerando que entre um usuário por minuto terá em torno de 30 sessões penduradas por nada.
Na verdade, mesmo com esse tipo de solução a quantidade é aproximada. Dependendo do número de usuários que fazem login/logout por minuto na sua aplicação.
Como assim o “ping falhar” ? Se ocorrer falhas você descobre o motivo do problema e corrige.
Se um problema desse tipo acontecer 10 vezes por dia é por que tem algum erro, não uma “falha”…
(Considero falha um fator externo imprevisível: falta de energia, perda de pacotes, etc…)
De qualquer forma a solução sugerida com ping é apenas uma implementação para um conceito.
O conceito é: se não posso saber quando você morreu, me avise sempre que está vivo.
Acredito que há várias formas de se implementar isso de forma confiável.