[session] Guardando todos os dados

9 respostas
_fs

Olá, boa tarde para todos :smiley:

Situação: preciso guardar certos atributos de todas as sessões que acessam minha app, assim posso saber quem está logado, entre outras informações.

Como fiz isso: criei um map estático que ter por indice os IDs das sessoes e como valor outro map com os atributos.

Problema: quando a sessão fosse encerrada, precisaria remover aquele usuário de minha variável estática.

Solução: implementei a interface HttpSessionListener, e no método sessionDestroyed() eu retiraria aquele ID do meu map statico.

Mas o problema agora é: meus listeners não são invocados! O que pode causar isso?

Valeu!

9 Respostas

Rafael_Steil

Voce declarou o teu listener no web.xml?

Rafael

_fs

Ok, pesquisei.

Mas quando eu faço isso:

<listener>
		<listener-class>
			javax.servlet.http.HttpSessionListener 
		</listener-class>
	</listener>

Minha webapp não é inicada pelo tomcat.

Estou fazendo corretamente?

Valeu[/code]

Rafael_Steil

A tag eh assim mesmo… qual o erro que o tomcat acusa?

a tag listener deve estar logo abaixo da web-app ( nao pode estar aninhada com alguma outra tag )

Rafael

_fs

Sim, eu fiz exatamente deste jeito.

O tomcat não aponta erro nenhum … minha aplicação simplesmente não é encontrada … “HTTP Status 404 - /SelectManager/”

Minha classe que contém os listeners pode conter outros métodos, certo? Pergunto isso porquê todos os exemplos que encontrei só possuiam os métodos obrigatorios da interface.

Olhe minha classe:

public class SessionControl implements HttpSessionListener

{
	private HttpServletRequest request = ActionContext.getRequest();
	private HttpSession session;
	
	private static Map logins = new HashMap();
	private Map info;
	
	public SessionControl()
	{
		session = request.getSession();
		session.setMaxInactiveInterval( 60 ); //em segundos
		
		info = new HashMap();
		info.put( "CreationTime", ( new Long( session.getCreationTime() ) ) );
		info.put( "LastAccessedTime", ( new Long( session.getLastAccessedTime() ) ) );
		
		synchronized( this )
		{
			logins.put( session.getId(), info );
		}
		
		JOptionPane.showMessageDialog( null, "logins.toString(): " + logins.toString() +
		 	"
Apelido: " + session.getAttribute( "Apelido" ) +
			"
SessionID: " + session.getId() );
	}
	
	public void setAttribute( String att, Object value )
	{
		session.setAttribute( att, value );
	}
	
	public String getId()
	{
		return session.getId();
	}
	
	public void sessionCreated( HttpSessionEvent e )
	{
		String s = "";
		
		s += "getSession: " + e.getSession();
		s += "
getSource: " + e.getSource();
		s += "
getClass: " + e.getClass();
		s += "
getId: " + session.getId();
		
		JOptionPane.showMessageDialog( null, "sessionCreated: " + s );
	}
	
	/**
	 * remove o conteudo da variavel que guarda os dados das sessões
	 */
	public void sessionDestroyed( HttpSessionEvent e )
	{
		String s = "";
		
		s += "getSession: " + e.getSession();
		s += "
getSource: " + e.getSource();
		s += "
getClass: " + e.getClass();
		s += "
getId: " + session.getId();
		
		JOptionPane.showMessageDialog( null, "sessionDestroyed: " + s );
		
		logins.remove( session.getId() );
	}
	
}

Vou continuar pesquisando … valeu Rafael :smiley:

urubatan

duvida,
vc colocou exatamente:

<listener> <listener-class> javax.servlet.http.HttpSessionListener </listener-class> </listener> no web.xml??
no lugar de: javax.servlet.http.HttpSessionListener deve ir o nome da classe que implementa javax.servlet.http.HttpSessionListener

_fs

Urubatan, obrigado pela dica, mas eu já tinah feito o que você falou :smiley:

Eu percebi o que causa o erro. Se eu crio ou faço referencia a uma instancia do objeto HttpSession, os listeners não funcionam e uma falha na inicialização de minha aplicação ocorre; caso contrário eles funcionam normalmente.

Se eu coloco isso no construtor da minha classe com listeners:

private HttpServletRequest request = ActionContext.getRequest();
	private HttpSession session = request.getSession();

Não funciona e não entendi o porquê.

Mas o fato é que eu PRECISO dessa instância. Continuar pesquisando.

Muito obrigado pela ajuda pessoal :D[/code]

leomc

estava com um problema parecido, mas era o web.xml que não estava correto.

_fs

leomc, tenho a sensasão que possui a resposta do meu problema … poderia então compartilhá-la? hehe sério, o que você mudou no web.xml?

Obrigado!

_fs

Consegui resolver aparentemente da maneira correta.

Só precisei colocar meu Map estatico na minha classe com listeners … e adicionar o HttpSessionAttributeListener … \o/

Valeu povo :smiley:

Criado 20 de fevereiro de 2004
Ultima resposta 25 de fev. de 2004
Respostas 9
Participantes 4