[RESOLVIDO]Como armazenar e recuperar informações do usuário logado? - Hibernate - JSF - PrimeFaces

Boa tarde,

Estou com um problema para resgatar as informações do usuário da sessão. Como eu posso fazer isso? Já efetuei várias tentativas porém sem sucesso. No caso, preciso armazenar essas informações para posteriormente resgatar e utilizar as infos em uma anotação @ManyToOne. Meus Beans estão anotados com @SessionScoped.
Obrigado.

Teoricamente, bastaria manter uma variável “usuário” no bean respectivo e seria fácil obter os dados a qualquer momento.
O problema seria o gerenciamento de memória, caso você insira muita informação na sessão.
Como está teu código?

package control;

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.eclipse.persistence.sessions.Session;
import dao.UsuarioDAO;
import model.Usuario;
import util.FacesUtil;

@ManagedBean
@SessionScoped
public class UsuarioBean implements Serializable {

	private Usuario usuario = new Usuario();

	private static final long serialVersionUID = 1L;

	private UsuarioDAO usuariodao = new UsuarioDAO();

	//GETTER E SETER USUARIO 
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	//METODO SALVA USUARIO
	public void salvarUsuario(Usuario usuario){

		usuariodao.SalvarUsuario(this.usuario);

	}
	//METODO PESQUISA LOGIN NO BANCO DE DADOS
	public String pesquisaLogin(){

		final Usuario userSessao;

		userSessao = usuariodao.PesquisarLogin(usuario.getCpf(),usuario.getSenha());

		System.out.println(userSessao.getNome());
		
		if(usuario.getCpf()!=null){

			return "inicio";
		}		

		else{

			FacesUtil.addErrorMessage("Usuario ou senha incorretos");
			return "login";
		}
	}

public static Session getSession(){
	
	Session session = getSession().getActiveSession();
	System.out.println(session);
	return session;
	}
}
 `


CLASSE DAO

`package dao;

import java.io.Serializable;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import model.Usuario;
import util.FacesUtil;

public class UsuarioDAO implements Serializable {

	Usuario usuario;

	private static final long serialVersionUID = 1L;

	public void SalvarUsuario (Usuario usuario){

		try {

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("calcPU");
			EntityManager em = emf.createEntityManager();

			em.getTransaction().begin();
			em.persist(usuario);
			em.getTransaction().commit();

			FacesUtil.addSuccesMessage("Usuário salvo com sucesso!");


		} catch (Exception e) {
			e.printStackTrace();


		}
	}

	public Usuario PesquisarLogin(String nomeCpfPesq, String senha) {

		try {

			EntityManagerFactory emf = Persistence.createEntityManagerFactory("calcPU");
			EntityManager em = emf.createEntityManager();

			Usuario pesq = em.find(Usuario.class, nomeCpfPesq);

			if(nomeCpfPesq.equals(pesq.getCpf())&&senha.equals(pesq.getSenha())){

				FacesUtil.addSuccesMessage("Usuário encontrado!");
				return pesq;
				
			}	else {
				
				FacesUtil.addErrorMessage("Usuario não encontrado! CPF ou Senha incorretos!");
				return null;
			}

		}catch (Exception e){

			FacesUtil.addErrorMessage("Usuario não encontrado! CPF ou Senha incorretos!");
			
			return null;
		

		
	}
	}
	
	
	
}

Se você estiver falando especificadamente da sessão, vc pode fazer assim:

HttpSession sessao = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
sessao.setAttribute("usuario_logado", user);//Esete user é meu objeto modelo que pode ser persistido.
Usuario usuarioLogado = (Usuario) sessao.getAttribute("usuario_logado");//Dai vc recupera o objeto usuario comas informação ajustadas no momento q salvou na sessao.

Olá Nadinaelsilva,

Meu projeto aparentemente não reconhece a classe HttpSession:

No caso, este código eu devo adicionar na Classe Bean do Usuário?

Você está fazendo confusão.
O escopo sessão (@SessionScoped) do JSF concede ao managed bean anotado a mesma funcionalidade que o httpsession.
Desta forma, bastaria você ter o usuário setado no managed bean que o acesso a seus dados seria direto.
Sugiro pesquisar melhor sobre isso.
Outro ponto, a interface HttpSession não está sendo reconhecida por faltar alguma lib, provavelmente será necessário incluí-la, caso não consiga entender como o managed bean de sessão funciona.

Essa classe faz parte do pacote básico de servlets, normalmente isso não acontece, verifique as configurações de pacote de seu projeto.
Esses códigos você vai usar normalmente em classes que precisam autenticar e validar usuários. Por exemplo: o trecho onde salvo o usuário na sessão, é chamado após o login ser bem sucedido. Já o trecho onde busco o usuário na sessão, está sendo chamado numa classe de validação, onde verifica se existe um usuário logado. Por exemplo, em um construtor de uma página que precise de um usuário para o cadastro de produtos, e que salve o usuário responsável por isso.
Bem, eu não posso ajudar com eclipse, faz quase um ano que não uso e o Netbeans cuida de importar as bibliotecas básicas. Vale reforçar, verifique o build path, e suas configurações, o real problema deve ser esse.

Hm, analisando os meus códigos os meus já estão setados, porém, ao relizar um “usuario.getNome()”; o valor retornado é nulo.

Não sei o que está tentando fazer.
O comportamento do session bean é o de manter as informações enquanto a sessão com o navegador do usuário se mantiver ativa.
Desta forma, o xhtml terá acesso aos dados já definidos no bean enquanto a sessão existir.
Lembre-se os atributos ficam “presos” ao managed bean e deveriam estar acessíveis a partir do seu respectivo getter.
Se este atributo ou os atributos do objeto que ele representa estão nulos, é preciso verificar se realmente tudo está funcionando direito…

Ao carregar meu projeto, ele apresenta alguns erros, relacionados aos Beans, será que pode ser isso que está impedindo das informações serem salvas corretamente?

O meu intuito em armazenar essas informações, é utilizar os dados do usuário para que sejam inseridos a PK juntamente com um registro por exemplo de “Renda” em meu projeto, onde futuramente, poderia selecionar via Query apenas as rendas de determinado usuário, evitando assim, que outros usuários tenham acesso a Rendas que não o pertencem.

set 23, 2016 4:34:33 PM org.apache.tomcat.util.digester.SetPropertiesRule begin ADVERTÊNCIA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:projetoCalc-me' did not find a matching property. set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Server version: Apache Tomcat/9.0.0.M9 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Server built: Jul 4 2016 18:22:47 UTC set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Server number: 9.0.0.0 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: OS Name: Windows 10 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: OS Version: 10.0 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Architecture: amd64 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Java Home: C:\Program Files\Java\jre1.8.0_101 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: JVM Version: 1.8.0_101-b13 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: JVM Vendor: Oracle Corporation set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: CATALINA_BASE: C:\Users\Mayque.silva\workspace\MayqueWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: CATALINA_HOME: C:\Program Files\Apache Software Foundation\Tomcat 9.0 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Command line argument: -Dcatalina.base=C:\Users\Mayque.silva\workspace\MayqueWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Command line argument: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat 9.0 set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Command line argument: -Dwtp.deploy=C:\Users\Mayque.silva\workspace\MayqueWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Command line argument: -Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 9.0\endorsed set 23, 2016 4:34:33 PM org.apache.catalina.startup.VersionLoggerListener log INFORMAÇÕES: Command line argument: -Dfile.encoding=Cp1252 set 23, 2016 4:34:33 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent INFORMAÇÕES: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre1.8.0_101\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_101/bin/server;C:/Program Files/Java/jre1.8.0_101/bin;C:/Program Files/Java/jre1.8.0_101/lib/amd64;C:\Program Files\Java\jdk1.8.0_101\bin;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\MySQL\MySQL Fabric 1.5 & MySQL Utilities 1.5\;C:\Program Files (x86)\MySQL\MySQL Fabric 1.5 & MySQL Utilities 1.5\Doctrine extensions for PHP\;C:\Users\Mayque.silva\AppData\Local\Microsoft\WindowsApps;;C:\Users\Mayque.silva\eclipse\jee-neon\eclipse;;. set 23, 2016 4:34:33 PM org.apache.coyote.AbstractProtocol init INFORMAÇÕES: Initializing ProtocolHandler ["http-nio-8080"] set 23, 2016 4:34:34 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector INFORMAÇÕES: Using a shared selector for servlet write/read set 23, 2016 4:34:34 PM org.apache.coyote.AbstractProtocol init INFORMAÇÕES: Initializing ProtocolHandler ["ajp-nio-8009"] set 23, 2016 4:34:34 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector INFORMAÇÕES: Using a shared selector for servlet write/read set 23, 2016 4:34:34 PM org.apache.catalina.startup.Catalina load INFORMAÇÕES: Initialization processed in 1664 ms set 23, 2016 4:34:34 PM org.apache.catalina.core.StandardService startInternal INFORMAÇÕES: Starting service Catalina set 23, 2016 4:34:34 PM org.apache.catalina.core.StandardEngine startInternal INFORMAÇÕES: Starting Servlet Engine: Apache Tomcat/9.0.0.M9 set 23, 2016 4:34:41 PM org.apache.jasper.servlet.TldScanner scanJars INFORMAÇÕES: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. set 23, 2016 4:34:41 PM com.sun.faces.config.ConfigureListener contextInitialized INFORMAÇÕES: Inicializando Mojarra 2.2.8 ( 20140814-1418 https://svn.java.net/svn/mojarra~svn/tags/2.2.8@13507) para o contexto '/projetoCalc-me' set 23, 2016 4:34:42 PM com.sun.faces.spi.InjectionProviderFactory createInstance INFORMAÇÕES: JSF1048: Anotações PostConstruct/PreDestroy presentes. Os métodos ManagedBeans marcados com essas anotações informarão as anotações processadas. set 23, 2016 4:34:44 PM org.primefaces.webapp.PostConstructApplicationEventListener processEvent INFORMAÇÕES: Running on PrimeFaces 6.0 set 23, 2016 4:34:44 PM com.sun.faces.config.ConfigureListener contextInitialized INFORMAÇÕES: Inicializando Mojarra 2.2.8 ( 20140814-1418 https://svn.java.net/svn/mojarra~svn/tags/2.2.8@13507) para o contexto '/projetoCalc-me' set 23, 2016 4:34:44 PM com.sun.faces.spi.InjectionProviderFactory createInstance INFORMAÇÕES: JSF1048: Anotações PostConstruct/PreDestroy presentes. Os métodos ManagedBeans marcados com essas anotações informarão as anotações processadas. set 23, 2016 4:34:44 PM com.sun.faces.mgbean.BeanManager addBean ADVERTÊNCIA: JSF1074: O bean gerenciado denominado 'usuarioBean' já foi registrado. Substituindo o tipo de classe do bean gerenciado control.UsuarioBean por control.UsuarioBean. set 23, 2016 4:34:44 PM com.sun.faces.mgbean.BeanManager addBean ADVERTÊNCIA: JSF1074: O bean gerenciado denominado 'despesaBean' já foi registrado. Substituindo o tipo de classe do bean gerenciado control.DespesaBean por control.DespesaBean. set 23, 2016 4:34:44 PM com.sun.faces.mgbean.BeanManager addBean ADVERTÊNCIA: JSF1074: O bean gerenciado denominado 'rendaBean' já foi registrado. Substituindo o tipo de classe do bean gerenciado control.RendaBean por control.RendaBean. set 23, 2016 4:34:44 PM org.primefaces.webapp.PostConstructApplicationEventListener processEvent INFORMAÇÕES: Running on PrimeFaces 6.0 set 23, 2016 4:34:44 PM org.primefaces.webapp.PostConstructApplicationEventListener processEvent INFORMAÇÕES: Running on PrimeFaces 6.0 set 23, 2016 4:34:44 PM org.apache.coyote.AbstractProtocol start INFORMAÇÕES: Starting ProtocolHandler [http-nio-8080] set 23, 2016 4:34:44 PM org.apache.coyote.AbstractProtocol start INFORMAÇÕES: Starting ProtocolHandler [ajp-nio-8009] set 23, 2016 4:34:44 PM org.apache.catalina.startup.Catalina start INFORMAÇÕES: Server startup in 10847 ms

Bem utilizo essa função no JSF e nunca me deixou na mão

Para enviar o objeto

      public void mandarObjeto() {
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("objeto", objeto);
      }

Para recuperar o objeto

	@PostConstruct
	private void init() {
		objeto =       
                     FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("objeto");
        }

Espero ter ajudado

1 curtida

São apenas informações e alertas, não erros.

Tenta Assim:

@SuppressWarnings("rawtypes")
	public static Object getSessionAttribute(String attributeName) {
		try {
			ExternalContext ec = getExternalContext();
			if (ec != null) {
				Map attrMap = ec.getSessionMap();
				if (attrMap != null) {
					return attrMap.get(attributeName);
				} else {
					return null;
				}
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static void setSessionAttribute(String attributeName, Object attributeValue) {
		try {
			ExternalContext ec = getExternalContext();
			if (ec != null) {
				Map attrMap = ec.getSessionMap();
				if (attrMap != null) {
					attrMap.put(attributeName, attributeValue);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static ExternalContext getExternalContext() {
		try {
			FacesContext facesContext = FacesContext.getCurrentInstance();
			if (facesContext == null) {
				return null;
			} else {
				return facesContext.getExternalContext();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
}

Fala galera,

Consegui resolver apenas na data de hoje. Passos que executei para resolver:

-Reinstalei um eclipse de versão anterior (Kepler).
-Utilizei o método Serializable, onde o mesmo pode escrever informações de um determinado objeto em um arquivo de texto para que possa recuperar posteriormente.

Obrigado pela ajuda!.

1 curtida

Este é o método que uso para guardar o usuário Logado:

public class Sessao {
// Variável estática que conterá a instancia da classe
private static Sessao instance;
private static Usuario usuarioLogado;

// Construtor 
public Sessao() {}

// Método público estático de acesso único ao objeto!
public static Sessao getInstance() {
    if (instance == null) {
        usuarioLogado = new Usuario();
        instance = new Sessao();
    }
    return instance;
}

public Usuario getUsuarioLogado() {return usuarioLogado;}
public void setUsuarioLogado (Usuario usuario) {this.usuarioLogado  = usuario;}


public static Sessao VerificaLogin(String Login, String Senha) throws SQLException {
    Connection conn = null;
    Sessao sessao;
    try {
        sessao = Sessao.getInstance();
        sessao.getUsuarioLogado().setLogin(Login);
        sessao.getUsuarioLogado().setSenha(Senha);
        conn = Conn.getConnection();            
        sessao = UsuarioPersist.login(conn, sessao);            
    } catch (Exception ex) {
        return null;
    } finally {
        conn.close();
    }
    return sessao;
}

}

Este é o meu Model do usuário:

public class Usuario {

private String login;
private String nome;
private String senha;
private String email;
private String perfil;
private String ativo;
private String acao;
private boolean logado;

public String getLogin () {return login;}
public String getSenha () {return senha;}
public String getNome  () {return nome;}
public String getEmail () {return email;}
public String getPerfil() {return perfil;}
public String getAtivo () {return ativo;}
public String getAcao  () {return acao;}

public void setLogin (String login) {this.login  = login;}
public void setSenha (String senha) {this.senha  = senha;}
public void setNome  (String nome)  {this.nome   = nome;}
public void setEmail (String email) {this.email  = email;}
public void setPerfil(String perfil){this.perfil = perfil;}
public void setAtivo (String ativo) {this.ativo  = ativo;}
public void setAcao  (String acao)  {this.acao   = acao;}

public void setLogado(boolean logado) {this.logado = logado;}
public boolean isLogado() {return logado;}

}

Quando o usuário se loga eu faço essa chamada:

Sessao sessao = Sessao.VerificaLogin(TxtLogin.getText(), TxtSenha.getText());

E instacio sempre onde preciso verificar os dados do usuário:

Sessao sessao = Sessao.getInstance();

UsuarioPersist.login(conn, sessao); é o método que me retorna “sessao” e faz a verificação do usuário.

Espero ter ajudado.