Guardar informações na "sessão" com EJB - Java - GUJ
Guardar informações na "sessão" com EJB
AntonioT Abril 4, 2009, 12:51am #1
Estou há 3 dias revirando a internet em busca da solução do meu problema e não achei nada.
Estou fazendo uma aplição com EJB3 e Swing.
Criei o bean para a realização de login e tudo funciona OK.
Porém estou precisando guardar no lado do servidor as informações do usuário logado, para posterior verificação de permissões e geração de logs de alteração de dados.
Sei que o correto seria utilizar algo como o JAAS e não reinventar a roda, mas meu chefe é averso ao fato do JAAS ficar fora da aplicação e outras coisas. Então tenho que seguir com este meu controle de login custom, dentro da aplicação server.
Então precisaria que após a chamada ao session bean que realiza a autenticação do usuário eu pudesse guardar a instância do entity bean User em algum lugar que eu pudesse resgatar por outros beans.
Na web eu guardaria na sessão http, mas no ambiente EJB não consigo encontrar algo parecido. Já fucei o SessionContext e outras coisas parecidas e nada da certo.
albama Abril 4, 2009, 10:00am #2
Se você criar um EJB Statefull
Quando o usuario chamar o ejb vc guarda na sessao, toda vez que ele precisar do EJB com os dados , vc vai na sessao.
Porém é preciso testar a chamada com Injeção de Dependência, alguns artigos que li , informaram que com DI , o acesso fica compartilhado, sendo ideal chamar com JNDI.
De qualquer forma com JNDI irá funcionar e vc podera pegar as informação do usuario no EJB.
albama Abril 4, 2009, 10:01am #3
Ah, me esqueci , se adotar esse desenho , nao esqueca de remover o EJB Statefull após o uso.
AntonioT Abril 4, 2009, 3:21pm #4
"Quando o usuario chamar o ejb vc guarda na sessao, toda vez que ele precisar do EJB com os dados , vc vai na sessao. "
Tipo, o problema está justamente no guardar na sessão. Como o ambiente não é Web não existe sessão. Então onde guardar o objeto? Se eu fizer múltiplas chamadas à um EJB Stateful, cada chamada irá criar um objeto totalmente novo, sem as informações que guardei na primeira chamada. Lembrando que os dados do usuário logado irão ser utilizados em pontos distintos do sistema e não apenas no escopo de apenas 1 objeto ou método.
Não teria algo como o @singleton, só que a nível de cliente? Para que um determinado objeto fosse criado apenas 1 vez para cada cliente?
De toda forma vlw pela atenção albama!
albama Abril 4, 2009, 4:29pm #5
É verdade… terei que pensar … pois nunca passei por essa situação.
rabriol Abril 22, 2009, 8:12am #6
Antonio T, vou lhe explicar um caso semelhante que passei e vê se encaixa no seu caso…
eu tinha uma aplicação que chamava a tela de venda e depois a tela de produtos, acontece que quando eu chamava a tela de venda eu precisava manter a esse objeto venda aberto na sesssão por que conforme o usuário fosse comprando produtos eu ia adicionando no objeto vendas, para isso criei dois metodos no meu backing bean pra criar o escopo de sessão e assim não perder o objeto.
crie o primeiro metodo para poder injetar o objeto no escopo de sessão.
public Object actionCadastrar() {
//nesta parte eu jogo o objeto sales no escopo de sessão, assim quando eu passar para a proxima pagina poderei resgatar  objeto
request.getSession().setAttribute("sales", this.sales);
//o retorno aqui serve para dizer para o faces-config que ele deve ir para a proxima pagina.
return "Pagina_do_Produto";
e depois criei o segundo metodo que eu recuperava o obejto vendas do escopo de sessão e adionava o produto
public Object actionCadastraOrdem(){
//aqui eu pego o objeto de sessão sales, e jogo o objeto order dentro, que quando for persistir ja pega o id do sales e passa para o id do Order pois eles tem relação maytoone & onetomany