Objetos setados no Session Map sao perdidos

16 respostas
M

Ola,

Na minha Action estou implementando a interface Preparable para poder toda vez q a action for chamada, o WW pegar o usuario que esta na session e busca-lo no BD novamente para abrir uma nova Session do Hibernate.

Abaixo o codigo:

public class UsuarioAction extends ActionSupport implements Preparable {
   UsuarioManager manager;
   Usuario usuario;

   public void prepare() throws Exception
   {
        usuario=(Usuario)    
                     ActionContext.getContext().getSession().get("usuario");
        // Vai no BD novamente para abrir uma nova session do hibernate
       usuario= manager.getUsuario(usuario.getId());
    }
...
}

O problema eh q apos chamar algumas vezes a action, o usuario retornado do map vem NULL. Eu fiz minha classe usuario implementar a interface HttpSessionAttributeListener para verificar se o metodo attributeRemoved() era chamado em algum momento.

O metodo nunca eh chamado, portanto acho q o WW deve as vezes criar novas instancias dos Maps do ActionContext.

Alguem ja passou por essa situacao?

16 Respostas

Mauricio_Linhares

O navegador está sendo aberto e fechado? Está aceitando cookies? Você está usando reescrita de URL?

M

Cara, eu estou usando Webwork entao nao estou muito me preocupando com relacao a isso. Mas nao estou usando cookies, e acho q o WW deve utilizar o eskema de reescrita de URL. O navegador tb esta aberto o tempo inteiro.

_fs

Qual o tempo configurado para expirar a sessão?

M

eu configurei no web.xml com o valor -1, ou seja, NUNCA deveria expirar…

Lucas_Teixeira

Hum, me perdoe a ignorância Marcos, mas para quê você vai toda hora no banco buscar a mesma informação? Não seria muito mais bonito e pratico se você mantivesse o usuário por completo na sessão?
Tudo isso seria para abrir uma nova session do Hibernate? Hum, e porque exatamente isso?

[]s

Thiago_Senna

Marcos?

U usuário está sendo armazenado dentro de um Mapa?

Vc implementou corretamente o método toString() e o método hashCode()?

Qual implementação de Map vc tá usando? HashTable? Tome cuidado com estes detalhes, principalmente com o hashCode e o toString, pois caso contrário, vc armazenará seu objeto no mapa e não conseguirá recuperá-lo!
Procure algum material que comente sobre o assunto. No livro de certificação da Kath Sierra trata bém sobre este assunto.

Abraços!
Thiago

Mauricio_Linhares

O WebWork empacota a session e o resto das coisas em Maps, em vez das interfaces da API de servlets.

M

Lucas,

cada vez q minha action eh chamada, eu tenho q ir no banco buscar a mesma informacao, pq o objeto (Usuario) q eu recupero do map da Session do webwork ja teve sua sessao do hibernate fechada. Entao tenho q buscar novamente o usuario no banco para abrir uma nova session do hibernate.

Estou usando aquele interceptor OpenSessionInView que mantem a sessao do hibernate ate a camada de apresentacao. Com certeza deve haver solucoes melhores que esta, mas o meu problema eh o fato de quando eu tento recuperar esse objeto Usuario do map do webwork, depois de sucessivas chamadas a essa Action o retorno metodo

usuario=(Usuario)ActionContext.getContext().getSession().get("usuario");

retorna null…Eh isso q eu queria entender…

Lucas_Teixeira

Entendo.

Mas me diga uma coisa, me explique o porque de se abrir uma sessão do Hibernate logo que a action for executada. Porque não deixar isso a cargo real de uma consulta quando for para ser utilizada. O teu gerenciador do hibernate, quando vai retornar uma sessão, deveria verificar se existe uma sessão aberta, se existe retorna. Caso não, abra, e retorne.

Digo isso Marcos, pelo fato de que certas actions não necessariamente farão consultas no banco, concorda comigo? E isso acaba se tornando recurso jogado fora, não?

Bom, é apenas uma opinião minha. (;

Mas ok… Vamos ao teu problema, me diga quando é que você tá armazenando o usuário na session. Por ai eu só vi ele tentando resgatar. Você faz isso quando ele loga? De que maneira?

Ahh, tem gente que ainda confunde uma ‘sessão’ do Hibernate com uma ‘sessão’ do usuário no contexto web. (;

M

Lucas,

no caso dessa Action, indepedente de qual operacao CRUD relacionada ela execute, o jsp retornado monta sempre uma arvore de Usuarios, atualizada, que lista os usuarios que estao subordinados ao usuario que esta logado.

Ou seja, minha classe Usuario eh algo assim:

public class Usuario implements Serializable{
     private String nome;
     private String login;
     private List<Usuario> listaDeSubordinados;
    ...
}

O objeto Usuario carrega a listaDeSubordinados com lazy loading do hibernate.

Eu ponho o usuario logado no map da session do webwork no login

public class LoginAction extends ActionSupport {
     private UsuarioManager usuarioManager.
     private Usuario usuario;
     private String login;
     private String senha; 

     public String login()
    {
        usuarioLogado = usuarioManager.getUsuario(login, senha);
       if (usuarioLogado != null)
       {
           ActionContext.getContext().getSession().put("usuarioLogado",usuarioLogado);
           return SUCCESS;
       }
       ActionContext.getContext().getSession().put("message", getText("login.invalido"));
       return ERROR; /** Usuario nao foi autenticado!! */
    }
}

Deu pra entender agora o contexto da minha duvida?
Abraco

Lucas_Teixeira

Eu acho que descobri a América (;

Hehehehehe.

Olha como você atribui o objeto na sessão:

ActionContext.getContext().getSession().put("usuarioLogado",usuarioLogado);

E como você recupera

usuario=(Usuario)ActionContext.getContext().getSession().get("usuario");

E aí, achou algo? (:

M

Opss, erro de digitacao…ehehhe

Lucas_Teixeira

;D

Rafael_Steil

Nao faz sentido algum uma sessao nunca expirar. Com isso, o teu sistema vai ficar cheio de lixo na memoria relativamente rapido, e uma hora vai faltar memoria.

Rafael

M

Rafael, concordo plenamente contigo. Eu so pus a sessao para nunca expirar para afulinar as possibilidades que podem estar causando esse erro.

Abraco

_fs

Tenta
ServletActionContext.getRequest().getSession()

Criado 31 de maio de 2005
Ultima resposta 1 de jun. de 2005
Respostas 16
Participantes 6