RequestDispatcher.forward () vs HttpServletResponse.sendRedirect ()

Qual é a diferença conceitual entre forward() e sendRedirect() ?

método requestDispatcher – forward ()

  1. Quando usamos o método forward, a solicitação é transferida para outro recurso dentro do mesmo servidor para processamento adicional.

  2. Em caso de encaminhamento, o contêiner da Web manipula todo o processo internamente e o cliente ou navegador não está envolvido.

  3. Quando forward é chamado no object requestdispatcher, passamos os objects request e response para que o object request antigo esteja presente no novo recurso que processará nossa solicitação.

  4. Visualmente, não podemos ver o endereço encaminhado, é transparente.

  5. O uso do método forward () é mais rápido que o redirecionamento de envio.

  6. Quando redirecionamos usando forward e queremos usar os mesmos dados em um novo recurso, podemos usar request.setAttribute (), já que temos o object request disponível.

SendRedirect

  1. No caso de sendRedirect, a solicitação é transferida para outro recurso para outro domínio ou servidor diferente para processamento adicional.

  2. Quando você usa sendRedirect, o contêiner transfere a solicitação para o cliente ou navegador para que a URL fornecida dentro do método sendRedirect seja visível como uma nova solicitação para o cliente.

  3. No caso da chamada sendRedirect, os objects antigos de solicitação e resposta são perdidos porque são tratados como uma nova solicitação pelo navegador.

  4. Na barra de endereços, podemos ver o novo endereço redirecionado. Não é transparente.

  5. sendRedirect é mais lento porque uma viagem extra de ida e volta é necessária, porque a solicitação completamente nova é criada e o object de solicitação antigo é perdido. Dois pedidos de navegador necessários.

  6. Mas no sendRedirect, se quisermos usar, temos que armazenar os dados em session ou passar junto com o URL.

Qual deles é bom?

Depende do cenário em que método é mais útil.

Se você quiser controle é transferir para novo servidor ou contexto e é tratado como uma tarefa completamente nova, então vamos para Enviar Redirecionar. Geralmente, o encaminhamento deve ser usado se a operação puder ser repetida com segurança após o recarregamento do navegador da página da Web não afetará o resultado.

Fonte

Primeiro de tudo, o termo “redirecionamento” está no mundo de desenvolvimento web a ação de enviar ao cliente uma resposta HTTP vazia com apenas um header de Location com o novo URL em que o cliente tem que enviar uma nova solicitação GET. Então, basicamente:

  • Cliente envia uma solicitação HTTP para some.jsp .
  • O servidor envia uma resposta HTTP de volta com o Location: other.jsp header
  • O cliente envia uma solicitação HTTP para other.jsp (isso se reflete na barra de endereço do navegador!)
  • O servidor envia uma resposta HTTP de volta com o conteúdo de other.jsp .

Você pode rastreá-lo com o conjunto de ferramentas de desenvolvedor embutido / addon do webbrowser. Pressione F12 no Chrome / IE9 / Firebug e verifique a seção “Rede” para vê-lo.

Exatamente o acima é alcançado por sendRedirect("other.jsp") . O RequestDispatcher#forward() não envia um redirecionamento. Em vez disso, ele usa o conteúdo da página de destino como resposta HTTP.

  • Cliente envia uma solicitação HTTP para some.jsp .
  • O servidor envia uma resposta HTTP de volta com o conteúdo de other.jsp .

No entanto, como a solicitação HTTP original foi para some.jsp , o URL na barra de endereço do navegador permanece inalterado.


O RequestDispatcher é extremamente útil no paradigma MVC e / ou quando você deseja ocultar os JSPs do access direto. Você pode colocar JSP na pasta /WEB-INF e usar um Servlet que controla, pré-processa e pós-processa as solicitações. As JSPs na pasta /WEB-INF não são diretamente acessíveis por URL, mas o Servlet pode acessá-las usando RequestDispatcher#forward() .

Por exemplo, você pode ter um arquivo JSP em /WEB-INF/login.jsp e um LoginServlet que é mapeado em um url-pattern de url-pattern /login . Quando você invoca http://example.com/context/login , o doGet() do servlet será invocado. Você pode fazer qualquer material de pré- processamento e finalmente encaminhar o pedido como:

 request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); 

Quando você envia um formulário, normalmente deseja usar o POST :

 

Dessa forma, o doPost() do servlet será invocado e você poderá fazer qualquer material de pós- processamento (por exemplo, validação, lógica de negócios, login do usuário, etc.).

Se houver algum erro, você normalmente deseja encaminhar a solicitação de volta para a mesma página e exibir os erros ao lado dos campos de input e assim por diante. Você pode usar o RequestDispatcher para isso.

Se um POST for bem-sucedido, você normalmente deseja redirect a solicitação, para que a solicitação não seja reenviada quando o usuário atualizar a solicitação (por exemplo, pressionando F5 ou navegando de volta no histórico).

 User user = userDAO.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); // Login user. response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login. } else { request.setAttribute("error", "Unknown login, please try again."); // Set error. request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error. } 

Um redirecionamento instrui o cliente a triggersr uma nova solicitação GET no URL fornecido. Atualizar a solicitação só atualizaria a solicitação redirecionada e não a solicitação inicial. Isso evitará “duplos envios” e confusão e má experiência do usuário. Isso também é chamado de padrão POST-Redirect-GET .

A interface RequestDispatcher permite fazer um encaminhamento / inclusão do lado do servidor, enquanto o sendRedirect() faz um redirecionamento do lado do cliente. Em um redirecionamento do lado do cliente, o servidor enviará de volta um código de status HTTP 302 (redirecionamento temporário) que faz com que o navegador da Web emita uma nova solicitação HTTP GET para o conteúdo no local redirecionado. Em contraste, ao usar a interface RequestDispatcher , o include / forward para o novo recurso é tratado inteiramente no lado do servidor.

Qualquer um desses methods pode ser “melhor”, ou seja, mais adequado, dependendo do que você deseja fazer.

Um redirecionamento do lado do servidor é mais rápido na medida em que você obtém os dados de uma página diferente sem fazer uma ida e volta ao navegador. Mas o URL visto no navegador ainda é o endereço original, então você está criando uma pequena inconsistência lá.

Um redirecionamento do lado do cliente é mais versátil na medida em que pode enviá-lo para um servidor completamente diferente ou alterar o protocolo (por exemplo, de HTTP para HTTPS) ou ambos. E o navegador está ciente do novo URL. Mas é necessário um retorno e um retorno extra entre o servidor e o cliente.

SendRedirect() irá procurar o conteúdo entre os servidores. é lento porque tem que intimar o navegador enviando o URL do conteúdo. então o navegador criará uma nova solicitação para o conteúdo dentro do mesmo servidor ou em outro.

RquestDispatcher é para procurar o conteúdo dentro do servidor, eu acho. é o processo do lado do servidor e é mais rápido comparado ao método SendRedirect() . mas o fato é que ele não intimera o navegador em qual servidor está pesquisando a data ou o conteúdo requerido, nem solicitará que o navegador altere o URL na guia URL. por isso causa pouco inconveniente para o usuário.

Request Dispatcher é uma interface que é usada para despachar a solicitação ou resposta do recurso da web para outro recurso da web. Ele contém principalmente dois methods.

  1. request.forward(req,res) : Esse método é usado para encaminhar a solicitação de um recurso da web para outro recurso. ou seja, de um servlet para outro servlet ou de um aplicativo da web para outro appliacation da web.

  2. response.include(req,res) : Este método é usado inclui a resposta de um servlet para outro servlet

NOTA: Usando o Request Dispatcher, podemos encaminhar ou include a solicitação ou as respostas no mesmo servidor.

request.sendRedirect() : Ao usar isso, podemos encaminhar ou include a solicitação ou as respostas nos diferentes servidores. Neste, o cliente recebe uma intimação ao redirect a página, mas no processo acima, o cliente não receberá uma intimação

O redirecionamento técnico deve ser usado também se precisarmos transferir o controle para um domínio diferente ou para conseguir a separação da tarefa.

Por exemplo, no aplicativo de pagamento, fazemos o PaymentProcess primeiro e depois redirecionamos para displayPaymentInfo. Se o cliente atualizar o navegador, somente o displayPaymentInfo será feito novamente e o PaymentProcess não será repetido. Mas se usarmos forward nesse cenário, PaymentProcess e displayPaymentInfo serão executados novamente sequencialmente, o que pode resultar em dados incoistentes.

Para outros cenários, o encaminhamento é eficiente para usar, pois é mais rápido que o sendRedirect

A principal diferença importante entre o método forward () e sendRedirect () é que no caso de forward (), o redirecionamento acontece no final do servidor e não é visível para o cliente, mas no caso de sendRedirect (), o redirecionamento acontece no final do cliente e é visível para o cliente.

insira a descrição da imagem aqui