Dúvida Session

8 respostas
G

Oi pessoal,

Segue a dúvida que estou tendo. Uso Vraptor, Hibernate, JSP e MySql.
Fiz um JSP de login básico, me logo com um usuário que já foi cadastrado no banco e sou direcionado para uma página de login com sucesso. Nesta página imprimo a sessão onde o usuário logado é adicionado. Até esta parte tudo segue bem.

Ai então nesta mesma página clico em um link, que me direciona para outra lógica e imprime novamente a sessão.
O problema é que o usuário não está mais na sessao. O conceito do hibernteUtil é ser um Singleton pelo que intendi então acredito que estou fazendo algo de errado.

Alguem sabe me dizer porque, algum erro no código ou de conceito?

vlw

abaixo seguem as fotos e ordem de acontecimento

Tela login

Usuário logado - Imprimindo Sessão - usuário na sessão

Após clicar no link da foto anteorior - imprime sessão novamente - usuário não está mais lá

HibernateUtil

public class HibernateUtil
{

	private static SessionFactory factory;

	static
	{
		Configuration conf = new AnnotationConfiguration();
		conf.configure();
		factory = conf.buildSessionFactory();
	}
	
	public static Session getSession()
	{
		return factory.openSession();
	}

}

classe DaoFactory

public class DaoFactory
{
	private final Session session;
	private Transaction transaction;
	
	public DaoFactory()
	{
		this.session = HibernateUtil.getSession();
	}

Controlador User - metodo imprime Sessão

UserController(DaoFactory daofactory, Result result, Validator validator,WebUser webUser)
	{
		this.daoFactory = daofactory;
		this.result = result;
		this.validator = validator;
		this.webUser = webUser;
	}
	
	public String printSession()
	{
		return daoFactory.getSession().toString();	
	}






8 Respostas

Lucas_Cavalcanti

a Session não deveria ser a mesma mesmo… pq vc chamou outra vez o openSession…

o ideal é não ter um HibernateUtil no VRaptor 3, tem um jeito mais fácil e elegante de fazer isso…
http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/
capítulos do Hibernate

de qqer forma, ao logar você precisa colocar o Usuário na sessão, mas não na sessão do banco de dados, e sim na HttpSession

G

Vlw Lucas

Era essa mesmo minha dúvida.
Insistindo um pouco mais… eu na verdade peguei a apostila fj-28 e segui mais ou menos a ideia de lá.

tenho um WebUser que copiei da classe da apostila, só mudei o nome.

@Component
@SessionScoped
public class WebUser
{
	private User userLogged;
	
	public void login(User user)
	{
		this.userLogged = user;
	}
	
	public String getName()
	{
		return userLogged.getName();
	}
	
	public boolean isLogged()
	{
		return userLogged != null;
	}
}

Adiciono o usuário na sessão desta maneira, de acordo com a regra de efetuaLogin() abaixo, que tb praticamente copiei da apostila.
No return deste método retorno a String da sessão do banco e o usuário está lá. (estou confuso)
O que quero dizer com isso é que acho que estou misturando algum conceito. Se eu retorno a sessão do banco e o usuário está lá, pq depois não está mais?
Como eu faço para imprimir a sessão HttpSession dentro do Controller para ter certeza de que o user está lá?

public String efetuaLogin(User user)
	{
		this.daoFactory.beginTransaction();
		this.user = this.daoFactory.getUserDao().userExist(user);
		
		if( this.user == null )					
		{
			validator.add(new ValidationMessage("Login e/ou senha inválidos","user.login"));
		}
		validator.onErrorUse(page()).of(UserController.class).login();
		[b]this.webUser.login(user);				
		return this.daoFactory.getSession().toString();[/b]
	}

[/code]

Lucas_Cavalcanti

acho que vc tá se baseando pela FJ-28 antiga, pois a nova (q vc pode baixar lah no link que eu te mandei) não usa HibernateUtil…

o usuário estava na primeira sessão pq vc buscou ele do banco… a session só guarda o que foi salvo ou buscado enquanto ela esteve aberta… qdo voce abre outra sessão ela não tem nenhum objeto lah dentro ainda

G

É voce tem razão eu misturei um pouco as coisas, mas isso é pq estou mudando aos poucos pro jeito novo da apostila fj-28

Na verdade eu não estava mais usando o HibernateUtil, estava usando a session do Hibernate estendendo o Spring Provider, exemplo de outra apostila ai de vcs. Troquei pelo HibernateUtil por um momento para ter certeza de nao ser algum erro meu ao usar o Spring Provider

Estou mudando de acordo com a nova apostila, vou fazer parecido com a classe CriadorDeSession usando Spring mas vou fazendo a medida que entendo pq nao conheço muito de Spring.

Tava realmente confuso com o negócio da session, queria saber imprimir o HttpSession direto no controller por questão de honra agora, vc saberia como ?

Vlw pela ajuda

G

Basta mandar injetar a HttpSession via construtor:

public class MeuController {
    private HttpSession session;

    public MeuController(HttpSession session) {
         this.session = session;
    }

    public void foo() {
        System.out.println("session " + session);
    }
}
G

Da hora, é isso mesmo que eu queria

Mas nao deu certo aqui, o eclipse não encontra import pra HttpSession
Encontrei algo no google de implementar uma interface HttpSession, mas tb nao encontrei a interface.

G

Erro meu! Achei HttpSession, era erro no projeto aqui.
vlw !!

G

HttpSession já vem pronto e você não precisa implementar :smiley:

Para isso você deve ter lá no build path do eclipse algum appserver ou servlet container (como tomcat ou jetty)

Criado 15 de julho de 2010
Ultima resposta 15 de jul. de 2010
Respostas 8
Participantes 3