[RESOLVIDO] Singleton carregando último usuario logado

Pessoal,

Estou utilizando Singleton para armazenar usuario logado e estou com um problema para recuperar, pois os proximos usuarios logados estam carregando as propriedades do primeiro.

Singleton:

package 

public class UsuarioSessao {
	
	private static UsuarioSessao instance = null; 
	
	   private Usuario usuario;   
	  
	   private UsuarioSessao(){   
	   }   
	  
	   public void setUsuario(Usuario usuario){   
	      this.usuario = usuario;   
	   }   
	  
	   public Usuario getUsuario(){   
	       return usuario;    
	   }   
	   public static UsuarioSessao getInstance(){   
	         if(instance == null){   
	               instance = new UsuarioSessao();   
	         }   
	        return instance;   
	   }   

	}

Armazeando usuario:

	Usuario usuario = usuarioDAO.autenticar(usuario_sessao);
	UsuarioSessao us = UsuarioSessao.getInstance(); 
	us.setUsuario(usuario);

Recuperando Usuário:

	public Usuario carregarUsuarioAutenticado(Short codigo_usuario_autenticado) throws Exception{

		try{
			this.session = HibernateUtil.getSessionFactory().openSession();
		
		this.tx = this.session.beginTransaction();
		
		Usuario usuario = (Usuario) this.session.createCriteria(Usuario.class)
		.add(Restrictions.eq("cdUsuario", cdUsuario)).uniqueResult();
	
					
		return usuario;
		
		}catch (Exception e) {
			
			e.printStackTrace();
			
			throw new Exception();
		}
		
	}

O que pode estar errado?

ué, singleton para esse contexto ? esta fazendo exatamente o que ele é, unica instância num ponto global.

Quando iniciei o projeto pedi algumas dicas e me informaram que o Singleton serivira para autenticao.

Com o nome do usuario que carrego na aplicação utilizo criteria para carregar o objeto e para armazenar utilizo o singleton, quando quero carregar as propridades o do Usuario armazenado utilizo o getSession.

Isso não funcionaria?

O singleton mantém uma instancia pra todos os usuarios logados, se esse for um sistema desktop tudo bem, mas se for um sistema web você precisa ter algo como SessionScope.
Dependendo do framework utilizado existem opções mais elegantes e simples de manejar. Mas em ultima alternativa, obtenha a HttpSession e crie um atributo nela com o nome usuarioSessao, por exemplo, e quando precisar obter os dados do usuario logado recupere essa variavel de sessão.

Voce tem algum exemplo da aplicação do HTTPSession?

Se estiver utilizando servlet, no método doGet ou doPost, obtenha o HttpSession através de ma instancia de HttpServletRequest utilizando o método getSession, já com a instancia de HttpServletRequestHttpSessin em mãos faça assim.

HttpSession session = request.getSession();
session.setAttribute("usuarioLogado", usuarioLogado);

quando for necessario resgatar esse atributo é só utilizar

HttpSession session = request.getSession();
Usuario usuarioLogado = (Usuario) session.getAttribute("usuarioLogado");

Essa é a idéia, cada usuario logado na aplicação web possui uma sessão com o site, o que permitirá que você acesse apenas as informações daquele usuario logado, ao invés de pegar informações de outros usuarios.

Fonte: http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServlet.html
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html
http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSession.html

[quote=rfogo]Pessoal,

Estou utilizando Singleton para armazenar usuario logado e estou com um problema para recuperar, pois os proximos usuarios logados estam carregando as propriedades do primeiro.

(…)

O que pode estar errado?[/quote]

O que está errado é que você não sabe para que serve um Singleton. Você não pesquisou na internet o suficiente. Se o tivesse feito iria descobrir que Singleton não é para ser usado. Alguém lhe disse que daria certo… sei… e você acreditou ? Ora!

O signleton é único por sistema. O seu sistema só tem um usuário ? Ora pois então. Como você quer que funcione ? Vc está forçando que o seu sistema só tenha um usuário. Ora, isso signfiica que todo o mundo que entra vê o mesmo usuário. Caos!

Você precisa aprender bem como funciona uma aplicação web e conceito de escopo. Em web existem 4 escopos padrão Parametros, Requisição, Sessão e Aplicação. Estes escopos têm uma vida e todos os objetos dentro deles expriram no final dessa vida. A sessão é o escopo associado a segurança que pode memorizar o usuario entre requisições. Como alguem já explicou é este mecanismo que precisa usar, e não o singleton.

Estude mais sobre Servlet API e aplicações web.

Mesmo em uma aplicação desktop, signleton é uma má ideia.

[quote=sergiotaborda][quote=rfogo]Pessoal,

Estou utilizando Singleton para armazenar usuario logado e estou com um problema para recuperar, pois os proximos usuarios logados estam carregando as propriedades do primeiro.

(…)

O que pode estar errado?[/quote]

O que está errado é que você não sabe para que serve um Singleton. Você não pesquisou na internet o suficiente. Se o tivesse feito iria descobrir que Singleton não é para ser usado. Alguém lhe disse que daria certo… sei… e você acreditou ? Ora!

O signleton é único por sistema. O seu sistema só tem um usuário ? Ora pois então. Como você quer que funcione ? Vc está forçando que o seu sistema só tenha um usuário. Ora, isso signfiica que todo o mundo que entra vê o mesmo usuário. Caos!

Você precisa aprender bem como funciona uma aplicação web e conceito de escopo. Em web existem 4 escopos padrão Parametros, Requisição, Sessão e Aplicação. Estes escopos têm uma vida e todos os objetos dentro deles expriram no final dessa vida. A sessão é o escopo associado a segurança que pode memorizar o usuario entre requisições. Como alguem já explicou é este mecanismo que precisa usar, e não o singleton.

Estude mais sobre Servlet API e aplicações web.

Mesmo em uma aplicação desktop, signleton é uma má ideia.

[/quote]

depois do comentario do sergio fiquei sem saber o que falar. hehe.
Bom, remove o singleton da tua aplicação, além de seguir as dicas anteriores e ver o resultado. Outro detalhe importante, vai fazendo passo-passo e entender o pq. Não no copy/paste, pq isso é tiro no pé.

abracos,

Se fosse proibido perguntar teriam que bloquear o opção new post, se fosse proibido utilizar dicas de terceiros o forum nem existiria, se fosse proibido “acreditar” em terceiros só teriamos 2 ou 3 membros e o sergiotaborda seria um deles.

Mas obrigado pela as dicas de vcs, como estou utilizando flex lancei mão do FlexSession que é indicado para essas situações.

Obrigado!