Tem como contar quantas sessões estão ativas?

9 respostas
A

tenho um sistema:
hibernate, jsf, jaas, jboss, bla bla…

tem como eu contar quantas sessões estão ativas?

tpow eu sou administrador do sistema e quero ver quantas pessoas estão logadas…

e aproveitando, tem como saber quais pessoas? ^^ (aqui já é demais rsrs)

9 Respostas

R

Não sei quão mal-performático isso fica em um sistema com muitos usuários logados, mas a princípio poderia ter um Map<Integer, Usuario>, em que a chave Integer eh o id da sessão dele (aí você adiciona e remove do mapa no login e logout, respectivamente).
Daí da pra saber quantos usuários estão logados, bem como recuperar as informações deles.

H

Você poderia criar um listener de http. Toda sessão criada ele seria chamado e toda sessão finalizado ele tb seria chamado.

Mas não é nada bom isso não. É um resultado aproximado. [=

A

Rendrys:
Não sei quão mal-performático isso fica em um sistema com muitos usuários logados, mas a princípio poderia ter um Map<Integer, Usuario>, em que a chave Integer eh o id da sessão dele (aí você adiciona e remove do mapa no login e logout, respectivamente).
Daí da pra saber quantos usuários estão logados, bem como recuperar as informações deles.

tem razão, desse jeito ai da pra fazer… + achei que o JAAS tinha algo pronto já… agora sei pq eu pesquisei e não achei rsrs… . + realmente em questão de performance pode não ser viável, + foi só uma ideia que surgiu e fiquei curioso…

R

alandiniz:
tenho um sistema:
hibernate, jsf, jaas, jboss, bla bla…

tem como eu contar quantas sessões estão ativas?

tpow eu sou administrador do sistema e quero ver quantas pessoas estão logadas…

e aproveitando, tem como saber quais pessoas? ^^ (aqui já é demais rsrs)

Por coincidencia ja implementei isso que vc quer.Usei um listener,segue o código:

@Component("usuarioListener")
@Scope("singleton")
public class UsuarioListener implements HttpSessionAttributeListener {

	static int usuarios;
	@Override
	public void attributeAdded(HttpSessionBindingEvent evt) {
		if(evt.getName().equalsIgnoreCase("usuario")) usuarios++;
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent evt) {
		if(evt.getName().equalsIgnoreCase("usuario")) usuarios--;
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public int getUsuarios(){
		return usuarios;
	}

}
A
raf4ever:
alandiniz:
tenho um sistema: hibernate, jsf, jaas, jboss, bla bla..

tem como eu contar quantas sessões estão ativas?

tpow eu sou administrador do sistema e quero ver quantas pessoas estão logadas...

e aproveitando, tem como saber quais pessoas? ^^ (aqui já é demais rsrs)

Por coincidencia ja implementei isso que vc quer.Usei um listener,segue o código:

@Component("usuarioListener")
@Scope("singleton")
public class UsuarioListener implements HttpSessionAttributeListener {

	static int usuarios;
	@Override
	public void attributeAdded(HttpSessionBindingEvent evt) {
		if(evt.getName().equalsIgnoreCase("usuario")) usuarios++;
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent evt) {
		if(evt.getName().equalsIgnoreCase("usuario")) usuarios--;
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public int getUsuarios(){
		return usuarios;
	}

}

cara, perfeito, mto obrigado mesmo, fds vou tentar implementar no meu código...

e vc acha que consome muito da aplicação? não vai deixar mais lento?

R
alandiniz:
raf4ever:
alandiniz:
tenho um sistema: hibernate, jsf, jaas, jboss, bla bla..

tem como eu contar quantas sessões estão ativas?

tpow eu sou administrador do sistema e quero ver quantas pessoas estão logadas...

e aproveitando, tem como saber quais pessoas? ^^ (aqui já é demais rsrs)

Por coincidencia ja implementei isso que vc quer.Usei um listener,segue o código:

@Component("usuarioListener")
@Scope("singleton")
public class UsuarioListener implements HttpSessionAttributeListener {

	static int usuarios;
	@Override
	public void attributeAdded(HttpSessionBindingEvent evt) {
		if(evt.getName().equalsIgnoreCase("usuario")) usuarios++;
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent evt) {
		if(evt.getName().equalsIgnoreCase("usuario")) usuarios--;
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	public int getUsuarios(){
		return usuarios;
	}

}

cara, perfeito, mto obrigado mesmo, fds vou tentar implementar no meu código...

e vc acha que consome muito da aplicação? não vai deixar mais lento?

Creio que não tenha impacto na performance não.

E para mostrar na tela:
<h:outputText value="Usuários Conectados:#{usuarioListener.usuarios}"/>
A

alandiniz, no exemplo que passaram são para atributos da sessão, sua pergunta foi:

O link que passaram tem um exemplo do que você quer http://viralpatel.net/blogs/jsp-servlet-session-li...ial-example-in-eclipse-tomcat/, caso queira saber quais usuários é só adicionar um List de usuários.

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
public class SessionListener implements HttpSessionListener {
    private int sessionCount = 0;
 
    public void sessionCreated(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount++;
        }
 
        System.out.println("Session Created: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
 
    public void sessionDestroyed(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount--;
        }
        System.out.println("Session Destroyed: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
}
A
Alberes:
alandiniz, no exemplo que passaram são para atributos da sessão, sua pergunta foi:
tpow eu sou administrador do sistema e quero ver quantas pessoas estão logadas...

e aproveitando, tem como saber quais pessoas? ^^ (aqui já é demais rsrs)

O link que passaram tem um exemplo do que você quer http://viralpatel.net/blogs/jsp-servlet-session-li...ial-example-in-eclipse-tomcat/, caso queira saber quais usuários é só adicionar um List de usuários.

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
public class SessionListener implements HttpSessionListener {
    private int sessionCount = 0;
 
    public void sessionCreated(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount++;
        }
 
        System.out.println("Session Created: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
 
    public void sessionDestroyed(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount--;
        }
        System.out.println("Session Destroyed: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
}

uma dúvida, de qual importação vem o:
@Component("usuarioListener")
@Scope("singleton")

e o link ta quebrado :( http://viralpatel.net/blogs/jsp-servlet-session-li...ial-example-in-eclipse-tomcat/

A

Provavelmente é do JSF!

Segue o link do tutoral http://viralpatel.net/blogs/jsp-servlet-session-listener-tutorial-example-in-eclipse-tomcat/ que tem o que você precisa.

Controle das sessões criadas e destruídas, nesse exemplo só controla a quantidade, você pode alterar para guardar o nome do usuário, id ou um objeto que represente o usuário.

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
 
public class SessionListener implements HttpSessionListener {
    private int sessionCount = 0;
 
    public void sessionCreated(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount++;
        }
 
        System.out.println("Session Created: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
 
    public void sessionDestroyed(HttpSessionEvent event) {
        synchronized (this) {
            sessionCount--;
        }
        System.out.println("Session Destroyed: " + event.getSession().getId());
        System.out.println("Total Sessions: " + sessionCount);
    }
}

web.xml

<listener>
    <description>sessionListener</description>
    <listener-class>
        net.viralpatel.servlet.listener.SessionListener
    </listener-class>
</listener>
Criado 15 de junho de 2012
Ultima resposta 17 de jun. de 2012
Respostas 9
Participantes 5