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.