[RESOLVIDO] redirecionamento no VRaptor 3

3 respostas
katsukawa

Pessoal, ontem eu estava com um problema na parte de redirecionamento.

na minha lógica “errada” eu usava o redirecionamento no meu Interceptor assim:

result.use(logic()).redirectTo(IndexController.class).index();

Nessa lógica “errada” quando eu acessava minhas páginas apresentava um erro no FireFox “Erro de redirecionamento”

Então, procurando nos fórums encontrarei essa solução:

result.use(logic()).forwardTo(IndexController.class).index();

A minha dúvida é: Qual a diferença entre o redirectTo para o forwardTo?? Eu queria saber porque antes não dava certo e agora dá… :wink:

3 Respostas

G

redirect muda o fluxo no cliente, ou seja, o browser acessa uma nova URL.

forware muda o fluxo no servidor SEM o cliente saber, ou seja, a página vai seguir executando para onde você indicou sem o browser ser redirecionado.

O que você pode ter feito é redirecionar a página para ela mesma N vezes, sendo assim o firefox diz que houve excesso de redirecionamentos e lança esse erro. Você pode mostrar melhor seu controller para que pudessemos entender?

Se você tiver isso:

public void index() { result.use(logic()).redirectTo(IndexController.class).index(); }

Ou seja, você direciona o método para ele mesmo.

katsukawa

Opa!

Meu Controller:

package br.com.jcomputacao.vraptor.controller;

import static br.com.caelum.vraptor.view.Results.logic;
import static br.com.caelum.vraptor.view.Results.page;

import org.apache.log4j.Logger;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Validations;
import br.com.jcomputacao.vraptor.blank.IndexController;
import br.com.jcomputacao.vraptor.dao.PessoafisicaDao;
import br.com.jcomputacao.vraptor.interceptor.Open;
import br.com.jcomputacao.vraptor.model.Pessoafisica;
import br.com.jcomputacao.vraptor.model.Usuario;

@Open
@Resource
public class LoginController {

	private static final Logger logger = Logger.getLogger(LoginController.class);

	private final Usuario usuario;
	private final Result result;
	private final Validator validator;
	private final PessoafisicaDao dao;

	public LoginController(Usuario usuario, PessoafisicaDao dao, Result result, Validator validator) {
		this.usuario = usuario;
		this.dao = dao;
		this.result = result;
		this.validator = validator;
	}

	public void login(String login, String senha) {
	
		final Pessoafisica pessoafisica = dao.find(login, senha);
		System.out.println("Usuario encontrado: " + pessoafisica.getNome());

		validator.checking(new Validations() {{
			that(pessoafisica != null, "login","login.invalido");
		}});
		
		validator.onErrorUse(page()).of(IndexController.class).index();

		usuario.login(pessoafisica);
		result.use(logic()).redirectTo(IndexController.class).index();
	}
	
	public void form() {

	}
}
Meu Interceptor (se ajudar..):
package br.com.jcomputacao.vraptor.interceptor;

import static br.com.caelum.vraptor.view.Results.logic;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.jcomputacao.vraptor.blank.IndexController;
import br.com.jcomputacao.vraptor.model.Usuario;

@Intercepts
public class AuthorizationInterceptor implements Interceptor {

	private final Usuario usuario;
	private final Result result;

	public AuthorizationInterceptor(Usuario usuario, Result result) {
		this.usuario = usuario;
		this.result = result;
	}

	public boolean accepts(ResourceMethod method) {
		return !method.getMethod().isAnnotationPresent(Open.class)
			&& !method.getResource().getType().isAnnotationPresent(Open.class);
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance)
			throws InterceptionException {
		if (usuario.getPessoaFisica() == null) {
			System.out.println("Usuário não logado!");
			result.use(logic()).forwardTo(IndexController.class).index();
		} else {
			stack.next(method, resourceInstance);
		}
	}
}

Bom, agora eu tenho um outro problema que é o seguinte: Quando eu acesso minha index e clico numa opção que não está @Open (ou seja, aberta pra todos) ele me retorna um System.out.println("Usuário não logado!"). Então aí eu tento me logar e ele não faz a lógica do login e ainda por cima dá "Página não existente. 404".
Entretanto, quando acesso a index e direto faço o login ele executa a lógica e redireciona normal

:cry:

katsukawa

Resolvido!!

Erro tosco pessoal!!

Na verdade a lógica demora um pouco pra entrar na minha cabeça…

Eu to usando a lógica de validação que foi mostrada no tutorial da Caelum. O @Open deve estar em todos os métodos abertos para qualquer usuário, incluindo visitante.

O problema era que meu interceptor estava dando redirectTo (quando usuario não está logado) para meu médoto index na classe index. E meu index não estava anotado como @Open. Então ele entrava em looping pq quando eu acessava meu projeto eu já estaria deslogado então ele entraria no interceptor e o interceptor mandaria denovo para o index e assim por diante.

Foi essa a solução, anotar com @Open o meu index… Estagiário só se fu…!! :oops: :lol:

Criado 30 de outubro de 2009
Ultima resposta 30 de out. de 2009
Respostas 3
Participantes 2