Redirect vs Forward com Spring MVC

André Chaves
Code Maestro
Published in
3 min readMar 23, 2016

Ao programarmos para Web, é comum a necessidade de redirecionar nosso usuário para uma página diferente. Existem duas formas comuns de se realizar o redirecionamento: Forward e Redirect.

Porém, muitas vezes caímos na má pratica de utilizar apenas um dos dois. Afinal, ambos funcionam e conseguimos compilar nosso código com qualquer que seja. Entretanto, é importante saber quando e porque usar cada um.

Quando estamos programando uma aplicação Java Web com Spring MVC, temos como padrão de retorno de cada Request uma String que será tratada como Forward. Ou seja, quando temos um código que, simplesmente, retorna um formulário para preencher dados de uma pessoa:

@RequestMapping(method = RequestMethod.GET, value = “novaPessoa“)
public String novaPessoa(Pessoa pessoa) {
return “pessoa/formulario”;
}

Estamos utilizando redirecionamento Forward, pois este é o padrão do framework. E, podemos utilizar deste padrão para qualquer Request se quisermos.

Como, por exemplo, um Request que adicione uma pessoa no banco de dados:

@RequestMapping(method = RequestMethod.POST, value = adicionaPessoa“)
public String adicionaPessoa(Pessoa pessoa) {
pessoaDao.adiciona(pessoa);
return “pessoa/listaPessoas“;
}

Funcionará normalmente. Porém, não estamos a par do que realmente acontece e das consequências disso.

Se por um acaso um usuário atualizar a pagina após o Request adicionaPessoa, o que acontecerá? E, o mais importante, por que?

Aprofundando no Forward

O redirecionamento Forward é conhecido por ser executado pelo servlet, ou seja, roda no lado do servidor.

Portanto, nosso navegador apenas receberá o que for processado. E, por isso, podemos perceber que a URL não é alterada. Logo, se o usuário decidir atualizar a página, o mesmo Request será chamado no servidor e a mesma lógica será realizada.

O que, no nosso caso anterior, significa que para cada atualização realizada, um usuário será adicionado no banco.

Será que queremos um bug desse no nosso código? Quão fácil seria, para alguém com más intenções, super-popular nosso banco com dados repetidos?

Mas, a culpa é do Forward? Ou nossa de estarmos utilizando-o erroneamente?

O que realmente queremos é que ao adicionar um usuário, sejamos redirecionados para uma página limpa. Precisamos fazer com que o navegador redirecione para outra URL.

Aprofundando no Redirect

O Redirect é conhecido justamente por realizar o redirecionamento no lado do cliente. Ou seja, nosso navegador encaminhará para outra URL.

Com isso, temos um pequeno aumento no tempo de processamento da página pois são realizadas duas requisições no navegador.

Além de não repassar os objetos presentes no primeiro request. Mas não corremos o risco de repetir requisições na atualização da página.

E quando eu uso um ou outro?

O que é mais comum de se ver é que para todo Request que realiza mudanças no banco, utilizemos Redirect. Para os Requests que não realizam mudanças no banco, usamos Forward.

Como a mesma lógica é aplicada na definição do método do Request, é comum relacionar o método Post com Redirect e o método Get com Forward.

Mas cabe a nós analisar o contexto e entender qual dos dois tipos de redirecionamento é mais apropriado para nossa situação.

Sabendo que no nosso exemplo, queremos um redirecionamento para outra URI podemos usar o redirecionamento Redirect indicando para uma página de confirmação:

@RequestMapping(method = RequestMethod.GET, value = “adicionado“)
public String adicionado(Pessoa pessoa) {
return “pessoa/adicionado“;
}
@RequestMapping(method = RequestMethod.POST, value = “adicionaPessoa“)
public String adicionaPessoa(Pessoa pessoa) {
pessoaDao.adiciona(pessoa);
return “redirect:adicionado“;
}

Com isso, evitamos um bug grave. Pois entendemos como funciona as formas de redirecionamento e escolhemos a forma adequada para nossa situação.

Portanto, não podemos cair no comodismo de utilizar sempre o redirecionamento que o Framework define como padrão ou usar sempre o mesmo porque funciona de qualquer forma.

E você? Qual dos dois você usa com mais frequência e por que? Compartilha aqui com a gente nos comentários =)

--

--

André Chaves
Code Maestro

Empreendedor, CTO, desenvolvedor e apaixonado por automação.