Em um sistema web (TOMCAT), q tipo de abordagem vcs usariam para limitar a quantidade máxima de usuários logados ao mesmo tempo?
Como vocês implementaria um controle de usuários logados?
4 Respostas
Supondo que só existe um servidor, vc mantém uma lista de usuários logados no escopo de aplicação. Quando um usuário se loga, vc verifica o tamanho da lista. se o espaço foi esgotado vc nega o login. No logout vc remove da lista.
Só tenha atenção que o usuário pode fechar o browser e não dar logout direito.
O truque é colocar algum javascript na página que detecta o fechar da janela e envia um ajax que informa o servidor que o usuário saiu.
Eu também poderia diminuir o tempo de sessão expirada no web.xml, não?
Como é um caso simples com Tom Cat (sem um Portal, sign sign on e etc), Além dessa opção você pode controlar com listeners, ao expirar a sessão de um usuário, um evento é disparado limpando uma vaga da lista de limitação que pode ser armazenada no contexto da aplicação. Se não me engano é HttpSessionListener
public class SessionCounterListener implements HttpSessionListener {
private static int totalActiveSessions;
public static int getTotalActiveSession(){
return totalActiveSessions;
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
totalActiveSessions++;
System.out.println("sessionCreated - add one session into counter");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
totalActiveSessions--;
System.out.println("sessionDestroyed - deduct one session from counter");
}
}
<web-app ...>
<listener>
<listener-class>com.mkyong.SessionCounterListener</listener-class>
</listener>
</web-app>
Code link: http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/
Eu também poderia diminuir o tempo de sessão expirada no web.xml, não?
Não. Essa não é a solução porque tem outros efeitos secundários ruins.
Vc deve desacoplar o conceito de “sessão” da api de sevlets do conceito de “sessão” de login. Um sessão de login pode sobreviver mais ou menos que uma sessão do servlet ( usando cookies, por exemplo, o famoso “Lembre de mim”).
Se vc quer controlar o tempo da sessão, controle dentro da sua aplicação assim vc desacopla o sistema do funcionamento do web container e tem mais flexibilidade para criar mecanismos mais uteis e com maior controle.