Redirecionamento
Redirecionamentos são fundamentais em aplicações Web para guiar usuários entre páginas após ações como login, envio de formulários ou atualizações de conteúdo. No Spring Boot, a abordagem mais simples e direta para implementar redirecionamentos é usando @Controller em conjunto com o prefixo redirect. Vamos aprender através de um exemplo prático.
Exemplo: Lista de Produtos
- Exibir a lista de produtos em uma página HTML.
- Cadastrar um novo produto via formulário e redirecionar para a lista atualizada.
Passo 1: Controller sem Redirecionamento (Problema!)
@Controller
public class ProdutoController {
List<String> produtos = new ArrayList<>();
// Rota para exibir a lista de produtos
@GetMapping("/listarProdutos")
public String listarProdutos(Model model) {
model.addAttribute("produtos", produtos);
return "listarProdutos.html"; // Renderiza o template Thymeleaf
}
// Rota para cadastrar um produto (sem redirecionamento)
@PostMapping("/cadastrarProduto")
public String cadastrarProduto() {
...
return "listarProdutos.html"; // ❌ Problema!
}
}
O Que Acontece Aqui?
- Ao acessar
/listarProdutos, o métodolistarProdutospopula o model com a lista e renderiza o template corretamente. - Ao enviar um produto via POST para
/cadastrarProduto, o método retorna diretamente o templatelistarProdutos.html, mas o model não é preenchido novamente. Resultado:- A lista de produtos aparecerá vazia na página.
- A URL do navegador permanecerá
/cadastrarProduto, causando confusão ao usuário.
Passo 2: Solução com Redirecionamento
@PostMapping("/cadastrarProduto")
public String cadastrarProduto() {
...
return "redirect:/listarProdutos"; // ✅ Redireciona para a rota GET
}
Por Que Funciona?
- O método
cadastrarProdutoprocessa o POST, adiciona o produto à lista e retornaredirect:/listarProdutos. - O Spring Boot envia uma resposta HTTP 302 (Found) para o navegador, instruindo-o a fazer uma nova requisição GET para
/listarProdutos. - A rota
listarProdutosé executada novamente, preenchendo o model com a lista atualizada e renderizando o template corretamente.
Resultado:
- A URL do navegador muda para
/listarProdutos. - A lista de produtos é exibida atualizada.
Melhores Práticas
-
POST-Redirect-GET (PRG):
- Sempre redirecione após um POST para evitar problemas de recarregamento de página e URLs inconsistentes.
-
Use
redirect:/rota:- Garante que o método do controlador associado à rota seja executado novamente (atualizando o model).
-
Mantenha a Separação de Responsabilidades:
- Métodos GET: exibem dados.
- Métodos POST: processam dados e redirecionam.
Usar redirect: no Spring Boot é essencial para garantir que o ciclo de vida das requisições HTTP seja respeitado, especialmente após operações que modificam dados (como POST). No exemplo apresentado, o redirecionamento não apenas atualiza a lista de produtos corretamente, mas também melhora a experiência do usuário ao manter a URL consistente e evitar comportamentos inesperados.