[RESOLVIDO] @SessionScope vraptor parece nao funcionar

11 respostas
S

ola a todos.
Estou usando @SessionScope e @Component na classe abaixo.
porem o atributo senha não fica na sessão.
o campo int m que é para teste, fica na sessão, pq inicio com 0 e depois quando autentica fica com 36, e ai no proximo request ele continua com 36.
porem se eu mudar o numero para 40 e reiniciar o tomcat ele mostra 36 e demora para mostrar 40.

outra duvida e quando o vraptor da o start na sessão?

package br.com.agile.sistema.negocio;

import java.io.Serializable;
import java.util.Date;

import br.com.agile.sistema.model.Senha;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class Logado implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 6851281174307159289L;
	
	private Senha senha;
	
	private int m = 0;
	
	public Date time;
	
	public Logado(){
		System.out.println("logado novo");
		this.time = new Date();
	}
	
	public Senha getSenha() {
		return senha;
	}

	public void setSenha(Senha senha) {
		this.senha = senha;	
		
	}
	
	public boolean isLogado(){

		System.out.println(this.getM());
		
		boolean _isLogado = false;
		
		_isLogado = this.getSenha() != null;
		
		_isLogado = (_isLogado) && (this.getSenha().getId() != null);

		_isLogado = (_isLogado) && (this.getSenha().getId()>0);

		this.setM(36);
		System.out.println("----");
		return _isLogado;
		
	}

	public int getM() {
		return m;
	}

	public void setM(int m) {
		this.m = m;
	}

}

11 Respostas

kadu.m.lino

Eai Salsicha blz?

vou tentar esclarecer sua dúvida!

Primeira pergunta… quem cuida da HTTP Session? O vraptor ou o servidor web?

Servidor Web, ou seja, o vraptor não tem nada a ver com isso! rs

O vraptor não dá start na sessão ele usa a session do servidor web, ele sim dá o start na session, pq ele sabe identificar o usuário… ele que gerencia essas responsabilidades de sessão… o vraptor apenas utiliza as informações que está no container, que no seu caso é o tomcat!
quando vc anota o seu bean com o @SessionScoped, toda vez que vc precisar dele o vraptor pergunta pro container se a session! isNew() se sim ele te retorna um novo obj para aquele usuário, caso o contrário, ele te retorna o msm obj!

vc vai entender melhor sobre a HTTPSession nessa API(http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html) que está muito bem explicada por sinal!

se vc quer que o tomcat não faça o redeploy da aplicação… limpa o cache dele… pausa o tomcat e dah um clean tomcat work directory…
ou tb cria um opção no seu controller pra deslogar o seu usuário da sessão!

espero que tenha ajudado!

abrass!

S

obrigado pela ajuda.

Mas acredito que a responsabilidade é do vraptor.

olhe o que ocorre

  • ele está conseguindo salvar o objeto na sessão http.
  • só que altero valor dos atributos dele, atributos tipo int.
  • na requisição seguinte a injeção não vem com o valor alterado e sim o iniciado.
  • mas objeto na sessão é o mesmo ele não recria.

da impressão que tem que atualizar ele na sessao.

kadu.m.lino

O Vraptor UTILIZA O HTTPSession, é diferente!

nesse caso eu vou dar uma olhada no que pode ser, ou o lucas pode nos ajudar tb! Mas muito estranho! Deveria alterar!

kadu.m.lino

Só pra não te deixar com dúvida!

The servlet container(TOMCAT no seu caso) uses this interface to create a session between an HTTP client and an HTTP server.

font : http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html

Mas isso não tem nada a ver com o problema! Se vc alterou o objeto deveria ter mudado o valor! tem como vc postar como vc implementou?

talvez vc esteja chamando o isLogado() depois de setar esse novo valor! aí o valor volta a ser 36… não sei se vc percebeu… mas esse valor é setado com ele logado ou não!

S

opa td bem,
a noite eu posto.
agora uma coisa que percebi que pode ter influencia e que eu recebo o Logado por injeção e vou passando ele por parametros e lá dentro de outro metodo ele sofre alteração.
mas acho que não pq a referencia e a mesma.

em todo caso obrigado pela ajuda e noite eu posto mais detalhhado o codigo.
valeu

S

opa Kadu blza
eu fiz um teste de sessão aqui e realmente ele grava certinho.
eu consegui resumir meu bloco de codigo para aonde realmente da erro.
abaixo temos o objeto logado @Component e @SessionScope eu recebo da view o objeto senha a classe dele e anotada com @Resource,
adiciono a senha no logado e ai depois que chamo o forwardto o objeto senha some do logado.
valeu

@Path("/login/realizar/")
	@NoInterceptLogado
	public void realizar(Senha senha, Logado logado) throws Exception {
	
		//o atributo senha tem que ficar na sessao
		logado.setSenha(senha);

		this.result.forwardTo(PrincipalController.class).inicio();
	}
S

cara to fazendo teste aqui…
coloquei uma mensagem no construtor do Logado que é logado novo,
eu retirei o forwardTo, e dexei ele acessar a pagina /projeto/login/realizar/,
nela seto a senha no logado como no post acima, e chamo um incrementador, que sai na mensagem antes 0 e depois 1
no realizar.jsp tem um link , que ao clicar nele percebe que ele cria o logado a cada clique.
segue o log…
[color=blue]
login contruido

Apresentando os Sessions da Sessao 6B60EE8961EDF0F11AF08319AD486840
nova sessao false
br.com.agile.sistema.negocio.Logado@12d391f8

org.springframework.web.context.request.DestructionCallbackBindingListener@143a70

criando LogadoIntercept validador de login
realizar aqui recebe por injeção o objeto Logado
logado novo aqui ta certo primeira inserção do logado
antes 0
depois 1

segundo acesso
login contruido
Apresentando os Sessions da Sessao 6B60EE8961EDF0F11AF08319AD486840
nova sessao false
br.com.agile.sistema.negocio.Logado@12d391f8

org.springframework.web.context.request.DestructionCallbackBindingListener@143a70

criando LogadoIntercept validador de login
realizar aqui recebe por injeção o objeto Logado
logado novo erro nao deveria inserir novamente
antes 0 aqui deveria ser 1
depois 1 aqui deveria ser 2

[/color]
percebe-se pelo httpsession que o Logado@12d391f8 é mesmo de todas requisições

Lucas_Cavalcanti

não receba o Logado no método e sim no construtor do controller… o que vc recebeu no método não é o que veio da sessão.

S

ola bom dia Lucas e a todos.
obrigado pela informação vou testar e dou retorno.

S

VALEU GENTE.
coisa simples porem não lembro de ter visto algo sobre este detalhe na documentação.

Lucas_Cavalcanti

http://vraptor.caelum.com.br/pt/docs/componentes/

aqui ele sempre fala pra receber os @Component no construtor. Não fala para receber no método.

No método do controller até funciona, mas só pra dependencias que são interfaces.

Criado 14 de fevereiro de 2013
Ultima resposta 15 de fev. de 2013
Respostas 11
Participantes 3