Search buenodc

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

  1. Exibir a lista de produtos em uma página HTML.
  2. 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étodo listarProdutos popula o model com a lista e renderiza o template corretamente.
  • Ao enviar um produto via POST para /cadastrarProduto, o método retorna diretamente o template listarProdutos.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?

  1. O método cadastrarProduto processa o POST, adiciona o produto à lista e retorna redirect:/listarProdutos.
  2. O Spring Boot envia uma resposta HTTP 302 (Found) para o navegador, instruindo-o a fazer uma nova requisição GET para /listarProdutos.
  3. 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

  1. POST-Redirect-GET (PRG):

    • Sempre redirecione após um POST para evitar problemas de recarregamento de página e URLs inconsistentes.
  2. Use redirect:/rota:

    • Garante que o método do controlador associado à rota seja executado novamente (atualizando o model).
  3. 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.