Problemas com sessão

18 respostas
W

Pessoal, tenho uma classe que contém alguns atributos de login, por exemplo o próprio login, o id da sessão, nome de usuario, etc…Em uma página de login, guardo esses atributos na classe com seus respectivos set’s e guardo a classe na sessão.

GuardaUsuario guardausuario = new GuardaUsuario();
guardausuario.setIdSessao( session.getId() ); 
guardausuario.setLogin(login);
session.setAttribute("GuardaUsuario",guardausuario);

Isso tudo está em um contexto chamado “capa”. Se tento recuperar as informações da sessão dentro do mesmo contexto, eu consigo, por exemplo:

GuardaUsuario g = (GuardaUsuario) session.getAttribute("GuardaUsuario");

Desse jeito ai, g não é null e tudo funciona !!!

O problema é que preciso recuperar esses dados em um outro contexto(aplicação) e quando uso o código acima, g é null, ou seja, eu não consigo recuperar os dados gravados na sessão no momento do login do usuário.

Alguém sabe o que pode estar acontecendo e como posso resolver isso? Se é que tem jeito? :?

18 Respostas

danieldestro

Você não pode acessar umas sessão de outra aplicação.
Mas vc pode acessar o contexto de outra aplicação. Faça assim:

getServletContext().getContext("OutraAplicacao");
W

você pode me dar um exemplo de como recupeo o context? O que irá receber a linha que vc me passou? Uma variável do tipo Context? Uma vez de posse do context como recupero os atributos que gravei la na sessão?

Você pode me ajudar com mais essa?

danieldestro

O código que eu coloquei aí retorna um ServletContext da aplicação que você desejar.

Porém, você não pode acessar uma sessão de outra aplicação, pois cada usuário tem uma sessão diferente em cada aplicação.

W

Mas não tem jeito mesmo de acessar os dados de outra aplicação? Você já precisou de algo desse tipo e implementou alguma solução e pode me dar algum conselho? O objetivo é o cara logar na página em um contexto “capa” e qdo pedir pra ver sua agenda no contexto “agenda” ele ja trazer os dados do banco referente ao usuário logado, pegando portanto os dados gravados na sessão no momento do login?

Você sugere alguma coisa? :?:

danieldestro

Isso é um problema comum em aplicações distribuídas.

Solução: Grave os dados no banco ao invés da sessão.

W

O id da sessão é unico não é? Ou seja, cada vez que eu fizer sessiong.getSessionId() vai me retornar um único número sem repetir?
Cao positivo seria algo do tipo criar uma tabela com os campos idsessao e login. Quando o cara logar eu gravo os dados nessa tabela e na página da agenda eu recupero o login associado àquele id de Sessão?

É por aí?

danieldestro

getSessionId( ) é único sim, porém eu não sei como funciona em aplicações distribuídas, mas creio que ele não gera o mesmo ID.

O que você deseja gravar “na sessão”???

Você pode ter uma tabela com os campos:

login = varchar(50) - guarda o login do usuário
atribute = varchar(50) - guarda o nome do atributo
value = blob - você pode serializar o objeto nele

E você trabalha como se fosse trabalhar na sessão.

W

quero guardar na sessão dados do funcionario como login, quadro setorial, matricula e mais uns 2 valores. Então tenho uma classe com esses atributos que seto com os métodos set’s de cada um a guardo essa classe na sessão. Nas outras páginas que preciso desses dados, recupero a sessão e os valores com métodos get’s.

Não entendi foi esse lance do campo ‘value’ que vc disse que eu poderia serializar o objeto, como funciona isso? vou guardá-lo na tabela? Nunca fiz isso, vc tem um exemplo?

A tabela poderia ficar então com idsessao, atribute e o objeto?

danieldestro

O campo idsessao eu não acho que seja uma boa idéia. Melhor seria usar LOGIN e ATRIBUTO como identificadores do registro.

Para serializar um objeto em arquivo:

File f = new File( "c:Obj.ser" ); OutputStream os = new FileOutputStream( f ); ObjectOutputStream oos = new ObjectOutputStream( os ); oos.writeObject ( seuObjeto ); oos.close(); s.close();

Isso grava seu objeto em Disco, no estado atual (com os dados dele).

Para recuperar você faz assim:

File f = new File( "c:Obj.ser" ); InputStream is = new FileInputStream( f ); ObjectInputStream ois = new ObjectInputStream( is ); seuObjeto = (SuaClasse) ois.readObject(); ois.close(); is.close();

Use este mesmo conceito para gravar o seu objeto no campo value, do tipo BLOB, no sue banco… Dá uma pesquisada na net para ver como faz isso.

Creio que seja melhor do que você ficar gravando uma dezena de campos para cada objeto.

W

Seria uma estrutura mais ou menos assim?

login atributo value
xx guarda_usuario <objeto>
yy guarda_usuario <objeto>

Mas o login e atributo como identificadores(chave primária)? O login sempre vai ser o mesmo e o atributo também também terá o mesmo nome, se é que entendi. Sendo assim como serão chaves? ou devo sobrepor os valores na segunda ocorrência de login do usuario?

Eu serializo e gravo no banco dados de um arquivo que não existe fisicamente?

danieldestro

Simplificando mais o registro:


| login | atributo | value |

| xxx | usuario | <object> |

LOGIN e ATRIBUTO seriam sua Primary Key.

Dá uma olhada em SessionListeners. Nele, no LOGOUT, você pode implementar um método para limpar os registro daquele Usuário em particular, quando ele der logout ou timeout.

E na verdade vc não vai gravar um arquivo, mas sim serializar o objeto. Ao inves de serialziar pro Arquivo, vc serializar pro banco.

W

Confesso que estou meio perdido…, como vou serializar para o banco? Tem métodos especificos para isso, assim como serializo para arquivo? ou devou gravar em arquivo fisico primeiro ler deste arquivo e gravar no banco? Estou dando voltas?

Qto a estrutura da tabela não entendi o palavra ‘usuario’ no campo atributo !?!?! Eu teria xxx usuario <object>, xxx matricula <object>
xxx quadrosetorial <object> ? No meu objeto eu gravo tudo isso com os set’s quando gravo o object já não está tudo lá?

danieldestro

Cara, quanto ao registro, no campo ATRIBUTO, você põe o nome que você quiser, porém em VALUE você gravaria o objeto todo, que no seu caso é o objeto do tipo GuardaUsuario.

E existem sim meio pra você serializar o objeto diretamente no banco. Dá uma procurada no Google, pois varia pra cada banco de dados.

abraços

Rafael_Steil

Setando o atributo “crossContext” da tag “Context” no server.xml nao ajudaria ?

Rafael

danieldestro

não conheço isso!

Rafael_Steil

Como nao?? tsc, tsc, tsc ( bom, eu tmb nao conheco, soh sei que existe uhaeuhaeuaeh ).

Wender, testa ai e diz pra nos se funciona :mrgreen:

Rafael

W

Vou dar uma olhada no google. Tive pensando a respeito do SessionListener que vc falou talvez seja interessante manter na tabela somente os clientes logados naquele momento e quando a sessão for encerrada excluir o registro. Eu cuido desse SessionListener com código java mesmo ou é alguma configuração XML no web.xml da aplicação pra quando a sessão iniciar ele inserir no banco e quando a sessão se encerrar por tempo ou um invalidate() for chamado ele excluir do banco?

Rafael_Steil

O codigo do SessionListener eh Java. Voce apenas precisa declarar o teu listener no web.xml

Rafael

Criado 31 de maio de 2004
Ultima resposta 1 de jun. de 2004
Respostas 18
Participantes 3