Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/03/2012 11:07:50
|
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?
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/03/2012 15:52:42
|
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?
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/03/2012 16:17:46
|
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)
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2012 06:12:09
|
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...
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2012 12:22:08
|
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.
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2012 12:44:20
|
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?
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2012 15:05:24
|
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();
}
}
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/03/2012 13:49:38
|
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?
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 31/03/2012 17:32:20
|
boaglio
![[Avatar]](/images/avatar/3416a75f4cea9109507cacd8e2f2aefc.jpg)
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
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/04/2012 06:05:58
|
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.
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/04/2012 10:01:12
|
boaglio
![[Avatar]](/images/avatar/3416a75f4cea9109507cacd8e2f2aefc.jpg)
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
|
|
 |
|