Vraptor 3 + perda de sessão tomcat 7

Olá pessoal,

Estou usando o vraptor 3.3.1 e percebi um problema grave em relação as sessões, vou tentar explicar da melhor forma possível:

Tenho um objeto anotado com @SessionScoped e @Component que serve como container de meus objetos que estão na sessão.

Realizando alguns testes, percebi que em determinado momento a sessão é trocada e os dados que estavam lá simplesmente somem e fico apenas com o meu objeto container sem os atributos que antes estavam lá. Em chamadas comuns o problema não aparece, contudo em chamadas com várias requisições ajax o estado da aplicação fica inconsistente devido a essa perda de sessão.

Estou usando o spring como provider e tomcat 7.0.8

Alguma luz ???

No seu web.xml como esta configurado este parametro:

<session-config>
<session-timeout>60</session-timeout>
    </session-config>

oi rodrigo…

sim. na verdade já testei vários valores para timeout, mas isso ocorre com o usuário ativo e não com ele deixando a aplicação sem acesso.

Vlw pela ajuda…

alguma coisa ajax que vc está usando é feita em flash?

oi lucas nao…

na verdade são requisições normais com jquery nada de anormal… estava pensando em trocar o provider para o pico ou guice, pois nos testes ele troca a session antes mesmo de chegar no interceptor.

uma outra coisa que testei foi com o run-jetty-run no lugar do plugin do eclipse e erro sumiu. Você recomenda algum caminho ?

Oi Lucas,

Como o problema é intermitente… fiz mais testes com o jetty e acabei pegando o problema tb.

Estou achando muito estranho, pois é um comportamento muito fora do comum ele troca o id da session…

Se tiver alguma idéia… será super bem vinda

só uma dúvida: o que vc quer dizer com várias requisições ajax? qual frequência?

oi. entaum, sao poucas. Eh uma pagina com 3 requisições ajax

Oi Lucas,

Acho que a.pergunta seria: Em que situacao que 1 classe marcada como @SessionScopped e @Component pode ter uma outra instancia (diferente da primeira) sendo injetada?

O que parece eh que o HttpSession muda, porque isso ocorre?

pois é… sua sessão deve estar sendo invalidada por algum motivo…

vc está mexendo com a session diretamente em algum lugar?

Oi Lucas,

Você se refere ao uso da HttpSession diretamente né? Se for isso, não uso.

Como te falei tenho um classe que encapsula os objetos que coloco na sessão, segue:

[code]package volayo.session;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import volayo.i18n.Language;
import volayo.model.Partner;
import volayo.model.Passenger;
import volayo.model.Payment;
import volayo.model.Reservation;
import volayo.request.SearchRequest;
import volayo.response.SearchResponse;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class VolayoSession implements Serializable {

private static final long serialVersionUID = -8181916272305302241L;

private Map&lt;Class&gt;&lt;?&gt;, Object&gt; attributes;

public VolayoSession() {
	this.attributes = new HashMap&lt;Class&gt;&lt;?&gt;, Object&gt;();
	setDefaultLanguage();
}

public &lt;T&gt; void put(Class&lt;T&gt; type, T attribute) {
	if (type == null)
		throw new NullPointerException("Type cannot be null !");
	else if (attribute == null)
		throw new NullPointerException("Attribute cannot be null !");

	this.attributes.put(type, type.cast(attribute));
}

public &lt;T&gt; boolean containsKey(Class&lt;T&gt; type) {
	return this.attributes.containsKey(type);
}

public &lt;T&gt; void removeFromSession(Class&lt;?&gt; type, Class&lt;?&gt;... types) {
	this.attributes.remove(type);
	for (Class&lt;?&gt; typeToRemove : types)
		this.attributes.remove(typeToRemove);
}

public void clearSession() {
	this.attributes.clear();
}

public Language getLanguage() {
	return get(Language.class);
}

public Passenger getPassenger() {
	return get(Passenger.class);
}

public Reservation getReservation() {
	return get(Reservation.class);
}

public SearchRequest getSearchRequest() {
	return get(SearchRequest.class);
}

public SearchResponse getSearchResponse() {
	return get(SearchResponse.class);
}

public Payment getPayment() {
	return get(Payment.class);
}

public Partner getPartner() {
	return get(Partner.class);
}

private &lt;T&gt; T get(Class&lt;T&gt; type) {
	return type.cast(attributes.get(type));
}

private void setDefaultLanguage() {
	this.attributes.put(Language.class, Language.PORTUGUESE);
}

}[/code]

Tenta fazer um teste:

crie um HttpSessionListener e registre-o no web.xml…

veja se está executando a invalidação da sessão no seu caso, e se possível quando (tenta pegar o request ou algo do tipo)

Oi Lucas,

Acho que descobri os problemas.

  1. No load da aplicação, instanciávamos na mão essa classe citada acima, o que já estava estranho por si só pois se é @Component e @SessionScoped o ideal é que o Vraptor cuidasse disso sozinho e eu estava concorrendo com ele.

  2. Além disso a aplicação fazia uso de cookies (salvando no cliente) o que poderia estar causando algo no HttpSession.

Em resumo, matei essas 2 dependências estranhas e o problema não mais ocorreu.

Muito Obrigado pela ajuda…

Aliás parabéns pela palestra de scala no qcon. Estava muito boa !!!

Abs,
Lucas