2
respostas

Qual seria a maior diferença na prática entre o redirect e o forward?

Olá, boa tarde!!

Qual seria, na prática as diferenças de se usar o sendRedirect e o requestDispatcher.forward, levando em conta a experiência do usuário, processamento..? Se puderem trazer outros exemplos pra que eu consiga visualizar e compreender contribuiria muito.

Desde já muito obrigada!!

:)

2 respostas

Ola Vanessa.

Realmente há uma grande diferença no ponto de vista do usuário entre as duas abordagens, e até mesmo sobre o correto fluxo da aplicação. Vou brevemente comentar sobre cada um.

No forward a servlet indica ao Container Web (Tomcat) qual caminho interno de uma página ele deve percorrer. Como é uma "conversa" entre a servlet e o servidor java, você pode indica-lo para um caminho de pagina que esteja dentro do WEB-INF, que será alcançado com sucesso. Após ler o arquivo com sucesso, o servidor faz 1 response ao navegador com aquele conteúdo.

Já no redirect a servlet indica um endereço externo, e ela cria uma response ao navegador com status http 302. O navegador ao receber esse retorno com esse status, automaticamente cria uma nova request para o endereço indicado, que após processar no servidor java, faz um segundo response com o conteúdo.

O fato de uma abordagem ter 1 requisição e a outra conter 2 requisições faz toda diferença. Veja:

Forward:

  1. Usuario cria uma requisição com os dados de um formulário, na barra de URL do navegador ficaria como "/aplicacao/cadastrar"
  2. A servlet dentro do WebContainer recebe a requisição e executa o código
  3. Ao fazer foward para uma página, há um direcionamento interno para a leitura de um JSP, com uma mensagem de sucesso
  4. O conteúdo do JSP é retornado e exibido. Nesse caso na barra de URL do navegador ainda ficaria como "/aplicacao/cadastrar" (pois do ponto de vista do navegador só teve aquela requisição)

Veja que nesse caso o usuário está vendo em tela uma mensagem de sucesso, mas a barra do navegador ainda esta apontando ao cadastrar. E mais: os dados tbm estão "cacheado" pelo navegador. Assim, caso o usuário der um F5, o navegador irá reenviar o cadastro com os mesmos dados.

Redirect:

  1. Usuario cria uma requisição com os dados de um formulário, na barra de URL do navegador ficaria como "/aplicacao/cadastrar"
  2. A servlet dentro do WebContainer recebe a requisição e executa o código
  3. Ao fazer redirect para um endereco como "/aplicacao/sucesso.jsp" (e nao um caminho de diretorio interno da JSP), há uma resposta de fato ao navegador com esse endereço e o status http 302. Esse codigo é inserido automatico pela servlet ao dar redirect.
  4. O navegador ao receber isso, automaticamente, modifica a barra de URL do navegador para o endereço pedido, ficando como "/aplicacao/sucesso.jsp"
  5. Há assim uma segunda requisição ao WebContainer, que lê a JSP e cria o retorno do conteúdo
  6. O conteúdo do JSP é retornado e exibido. Nesse caso na barra de URL do navegador ficaria a ultima requisição "/aplicacao/sucesso.jsp"

Veja que nesse caso ao usuario dar F5, ele vai estar sempre pedido a página de sucesso e não um cadastro novo. Essa é a forma mais segura de retornar um sucesso ao usuário.

Oi JP, poxa, obrigada!!!

Só mais uma dúvida para conferir se entendi bem (pedindo desculpas desde já pq provavelmente já está respondido eu é quem estou com dificuldade de entender ou aceitar kkkkk!):

No caso do forward, a cada F5, na prática os dados são reenviados, sendo feito outro cadastro idêntico?

Nos dois casos o usuário consegue usar o "voltar" para página anterior normalmente?

Por exemplo, como usuária, já aconteceu de eu estar em um site navegando, e para executar alguma coisa ele me pediu pra realizar um cadastro, eu realizo, porém, não consiguir voltar pra mesma página que eu estava, é como se ele me voltasse pro início do site, sabe? Nesse caso, o que é feito por baixo dos panos?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software