Redirecionamento de Servlet vs Encaminhamento

Redirecionamento de Servlet vs Encaminhamento

1. Visão geral

Ocasionalmente, o manipulador de solicitações HTTP inicial em nosso Java Servlet precisa delegar a solicitação a outro recurso. Nesses casos, podemos encaminhar ainda mais a solicitação ou redirecioná-la para um recurso diferente.

Usaremos ambos os mecanismos e discutiremos as diferenças e as melhores práticas de cada um.

2. Dependências do Maven

Primeiro, vamos adicionar a dependência do Servlet Maven:


    javax.servlet
    javax.servlet-api
    4.0.0

A versão mais recente pode ser encontradahere.

3. frente

Vamos agora começar e dar uma olhada em como fazer um avanço simples:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    RequestDispatcher dispatcher = getServletContext()
      .getRequestDispatcher("/forwarded");
    dispatcher.forward(req, resp);
}

Pegamos a referênciaRequestDispatcher do servlet pai e a apontamos para outro recurso do servidor.

Simplificando, isso encaminhará a solicitação.

Quando um cliente envia uma solicitação parahttp://localhost:8081/hello?name=Dennis, esta lógica será executada e a solicitação será encaminhada para “/forwarded“.

4. Redirecionar

Agora que entendemos o conceito de encaminhamento, vamos dar uma olhada em um snippet rápido para redirecionar:

protected void doGet(HttpServletRequest req, HttpServletResponse resp){
    resp.sendRedirect(req.getContextPath() + "/redirected");
}

We use original response object to redirect this request to another URL: “/redirected”.

Quando um cliente envia uma solicitação parahttp://localhost:8081/welcome?name=Dennis, a solicitação será redirecionada parahttp://localhost:8081/redirected.

Para saber mais sobre como fazer redirecionamentos no contexto do Spring, dê uma olhada em nossoarticle here dedicado.

5. Diferenças

Passamos o parâmetro “name” com um valor em ambos os casos. Simply put, forwarded requests still carry this value, but redirected requests don’t.

Isso ocorre porque, com um redirecionamento, o objeto de solicitação é diferente do original. Se ainda quisermos usar este parâmetro, precisamos salvá-lo no objetoHttpSession.

Aqui está uma lista das principais diferenças entre encaminhamento e redirecionamento de servlet:

Forward:

  • A solicitação será processada posteriormente no lado do servidor

  • O cliente não é afetado pelo encaminhamento, o URL em um navegador permanece o mesmo

  • Os objetos de solicitação e resposta permanecerão o mesmo objeto após o encaminhamento. Objetos de escopo de solicitação ainda estarão disponíveis

Redirect:

  • A solicitação é redirecionada para um recurso diferente

  • O cliente verá o URL mudar após o redirecionamento

  • Uma nova solicitação é criada

  • O redirecionamento é normalmente usado no padrão de desenvolvimento da webPost/Redirect/Get

6. Conclusão

Encaminhamento e redirecionamento são sobre o envio de um usuário para recursos diferentes, embora tenham semânticas bastante diferentes.

Escolher entre estes é simples. Se o escopo anterior é necessário, ou o usuário não precisa ser informado, mas o aplicativo também deseja realizar uma ação internathen use forwarding.

Para descartar o escopo ou se o novo conteúdo não estiver associado à solicitação original - como um redirecionamento para uma página de login ou preenchimento de um formulário de envio -then use redirecting.

Como sempre, o código de exemplo pode ser encontradoover on GitHub.