Adicionar exceção no Interceptor

4 respostas
italoborges

E ai pessoal!

Tenho um form de "login" e um form de "esqueceu sua senha". Criei um Interceptor no login para verificar se o usuário está logado ou não. Até aí tudo blza, se eu entrar em qualquer URL e o usuário não possuir sessão, ele direciona para o login.
Depois disso, eu resolvi criar o form para recuperar a senha. O problema é, quando estou no login e clico para recuperar a senha e direcionar para /recuperar, o Interceptor direciona para o login novamente.
Como eu adiciono uma exceção para ele poder acessar /recuperar? Preciso criar algum outro Interceptor Public por exemplo?

Segue minha classe Interceptor:
public class LoginInterceptor implements Interceptor {

	private final Result result;
	private final UserSession user;
	
	public LoginInterceptor (Result result, UserSession user)
	{
		this.result = result;
		this.user = user;
	}
	
	public boolean accepts(ResourceMethod method) 
	{
		return !(method.getMethod().isAnnotationPresent(Login.class)
		|| method.getResource().getType().isAnnotationPresent(Login.class));
	}
	 
	public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException
	{
		System.out.println("Interceptando");
		if (this.user.isLogged()) {
			System.out.println("Usuário logado");
			stack.next(method, resourceInstance);
		} 
		else {
			System.out.println("Usuário não logado");
			result.redirectTo(LoginController.class).login();
		}
	}
}

4 Respostas

Rafael_Guerreiro

Eu mudaria esse interceptor.

Por que você não cria uma annotation @AllowToOfflineUser e ai você anota as actions que podem ser acessadas por quem não está logado.

public boolean accepts(ResourceMethod method)   
    {   
        return (!method.getMethod().isAnnotationPresent(AllowToOfflineUser .class)   
        && !this.this.user.isLogged());
    }

public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException   
    {   
         this.logger.debug("Usuário deslogado está sendo redirecionado"); // usa o logger nas suas aplicações.
         result.redirectTo(LoginController.class).login();   
    }
italoborges

E ai Rafael, blza?

Não entendi bem o que vc criou aí.
Poderia explicar melhor?

Eu preciso validar se o usuário está logado ou não para restringir o acesso em algumas áreas. Já outras podem ter acesso, como o form de esqueceu a senha.

Obrigado!

Lucas_Cavalcanti

vc pode também anotar o método de esqueceu a senha com @Login

italoborges

Acabei seguindo este exemplo aqui:

http://marcelotozzi.com.br/2011/05/vraptor-entre-interceptors-e-annotations/

Achei melhor implementado, assim eu posso usar essas 2 anotações no projeto inteiro.

Criado 1 de junho de 2012
Ultima resposta 1 de jun. de 2012
Respostas 4
Participantes 3