Possuo um interceptor que basicamente gera logs das URLs acessadas pelos usuários, bem como parametros e afins.
[code]@Intercepts
@RequestScoped
public class UserLogInterceptor
implements Interceptor {
private final UserSession userSession;
private final HttpServletRequest request;
public UserLogInterceptor(UserSession userSession, HttpServletRequest request) {
this.userSession = userSession;
this.request = request;
}
@Override
public boolean accepts(ResourceMethod method) {
return true;
}
@Override
public void intercept(InterceptorStack stack, ResourceMethod method, Object object)
throws InterceptionException {
[...] //faz alguma coisa
}
}[/code]
O objeto UserSession é um objeto session-scoped que possui os dados do usuário. Como uso JAAS faço uma post-authentication para buscar os dados do usuário a partir do principal retornado no request. Isso funciona bem.
[code]@Component
@SessionScoped
public class UserSession
implements Serializable {
private final UserCredential myCredential;
public UserSession(HttpServletRequest request)
throws PolicyContextException {
final AuthenticationService service = ServiceLocator.getEJB(AuthenticationService.class);
myCredential = service.postJaasAuthentication(request.getUserPrincipal().getName(), request.getRemoteAddr());
}
@PreDestroy
public void destroy()
throws PolicyContextException {
ServiceLocator.getEJB(AuthenticationService.class).unauthenticate(myCredential.getEmail());
}
public UserCredential getMyCredential() {
return myCredential;
}
}[/code]
Até aqui tudo bem. Porém alterando algumas coisas no projeto houve a necessidade de avisar ao módulo EJB quando há tentativas de login inválidas. Então como uso JAAS via JDBC pensei: vou avisar via algum controller do Vraptor. Então alterei meu web.xml:
Enfim, essa volta toda para explicar que quando dá um erro de login, o vraptor dispara sempre o UserLogInterceptor. Tentei colocar alguma condição no método accepts, porém antes ele instancia o objeto UserSession que está no seu construtor, dando null-pointer-exception.
Então penso: não está errado instanciar para depois testar se ele pode ser aceito? Não seria interessante algum método que eu pudesse dizer quais as classes podem chamar esse interceptor? Pensei em primeira instância fazer um método extra estático que eu pudesse passar as classes. Ou então há alguma forma de eu evitar que o interceptor sempre seja chamado?
Claro que eu poderia colocar um if para evitar o nullpointer, porém achei um pouco estranho o comportamento de instanciar para depois testar se pode ser chamado.
UserLogInterceptor.acceptClasses {
return new Class[] {Fooclass, MyOtherClass.class, Bar.class };
}