[Logo] Mentawai Forum - Mentawai Web Framework
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 

Forum Read-Only! Check the new site and forum here!

Como pegar usuário fora da action?  XML
Forum Index -> Comentários Gerais
Author Message
klarq



Joined: 04/03/2008 10:22:13
Messages: 64
Offline

Fala pessoal,

Tenho um sistema ja em produção e queremos implementar agora um log para todas as inserções e alterações dos usuários.

Como estou usando hibernate pensei em usar o Interceptor, que é uma classe que é chamda toda vez que é chamda um inserções ou alteração

Minha dúvida: como pegar o usuário a partir desse interceptor?
ul1sses



Joined: 03/02/2012 13:46:19
Messages: 4
Offline

Não seria mais fácil implementar uma classe utilitária de log que seria chamada após o comando desejado.. e salvar na tabela? Pra que complicar?
Daniel Lima



Joined: 08/07/2009 14:48:10
Messages: 16
Offline

Para pegar o usuário logado você pode usar o código abaixo, mas se você quer é auditoria e já usa o Hibernate, então é melhor o Envers (http://www.jboss.org/envers) que é próprio pra isso.

Code:
ApplicationManager.getApplication().getAttribute(BaseLoginAction.USER_KEY)
klarq



Joined: 04/03/2008 10:22:13
Messages: 64
Offline

ul1sses wrote:
Não seria mais fácil implementar uma classe utilitária de log que seria chamada após o comando desejado.. e salvar na tabela? Pra que complicar? 


Obrigado pela dica, mas se entendi bem é isso que o interceptor está fazendo, não é?

Daniel Lima wrote:
Para pegar o usuário logado você pode usar o código abaixo, mas se você quer é auditoria e já usa o Hibernate, então é melhor o Envers (http://www.jboss.org/envers) que é próprio pra isso.

Code:
ApplicationManager.getApplication().getAttribute(BaseLoginAction.USER_KEY)
 


Retornou null o código acima...
Daniel Lima



Joined: 08/07/2009 14:48:10
Messages: 16
Offline

Bom, depende de como você faz o login. Se você usa o setUserSession(someUserObj) deveria funcionar.
klarq



Joined: 04/03/2008 10:22:13
Messages: 64
Offline

Daniel Lima wrote:
Bom, depende de como você faz o login. Se você usa o setUserSession(someUserObj) deveria funcionar. 


Eu uso esse método.

Mas fiz o seguinte. Na hora de logar eu fiz assim:
Code:
 setUserSession(usuarioBean);
 ApplicationManager.getApplication().setAttribute(BaseLoginAction.USER_KEY, usuarioBean);


Agora eu consegui pegar ele no interceptor. Mas tem um problema. Um usuário sobrescreve o outro. Acho que isso não é sessão e sim o contexto de aplicação.

É isso mesmo?
Daniel Lima



Joined: 08/07/2009 14:48:10
Messages: 16
Offline

É verdade, esse contexto retornado é o da aplicação e não o da sessão. Na verdade daria pra fazer o que você quer usando filtro, por exemplo:
Code:
 public class LoggedUserFilter implements Filter {
 
     @Override
     public void destroy() {
     }
 
     @Override
     public String filter(InvocationChain chain) throws Exception {
         Action action = chain.getAction();
 
         Context context = action.getSession();
 
         Object obj = context.getAttribute(BaseLoginAction.USER_KEY);
 
         // agora faz o que vc quiser com o usuario...
 
         return chain.invoke();
     }
 }
 

klarq



Joined: 04/03/2008 10:22:13
Messages: 64
Offline

O filtro não serve pra mim. Pois teria que mexer em muitas classes para enviar o usuário para as outras camadas.

O interceptor é a melhor maneira que encontrei ate agora.

Mas então não tem como pegar o usuário em uma classe qualquer, como na classe interceptor que mencionei?

No JSF tem esse metodo que ja testei e funciona corretamente:

Code:
FacesContext fc = FacesContext.getCurrentInstance();
 HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
 session.getAttribute("atr")


Não tem algo no mentawai desse tipo?
boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline

klarq wrote:


Eu uso esse método.

Mas fiz o seguinte. Na hora de logar eu fiz assim:
Code:
 setUserSession(usuarioBean);
 ApplicationManager.getApplication().setAttribute(BaseLoginAction.USER_KEY, usuarioBean);

 


Só o método setUserSession é suficiente para gravar o usuário na sessão, não precisa da outra linha q vc fez.

Para buscar esse usuarioBean depois, faça um getUserSession() .

http://www.boaglio.com
[WWW]
klarq



Joined: 04/03/2008 10:22:13
Messages: 64
Offline

boaglio wrote:

klarq wrote:


Eu uso esse método.

Mas fiz o seguinte. Na hora de logar eu fiz assim:
Code:
 setUserSession(usuarioBean);
 ApplicationManager.getApplication().setAttribute(BaseLoginAction.USER_KEY, usuarioBean);

 


Só o método setUserSession é suficiente para gravar o usuário na sessão, não precisa da outra linha q vc fez.

Para buscar esse usuarioBean depois, faça um getUserSession() .  



Então, isso funciona se a sua classe extender BaseAction, mas e se a sua classe não exterder a BaseAction. É possível, de alguma forma, acessar a sessão do usuário?

Como eu comentei, com JSF funciona e eu até ja testei.
boaglio


[Avatar]

Joined: 28/09/2005 11:05:16
Messages: 299
Location: Sao Paulo - Brazil
Offline


Entendi o que vc quer... tem q ser via filtro então, da mesma maneira que o JSF... aquela trecho q vc escreveu não funciona sem o filtro do RichFaces (ou Primefaces, Icefaces, etc) não for chamando antes da requisição HTTP.

http://www.boaglio.com
[WWW]
 
Forum Index -> Comentários Gerais
Go to:   
Powered by JForum 2.1.6 © JForum Team