现在的位置: 首页 > 综合 > 正文

[Question] What’s the difference between “redirect” & “forward” in servelt?

2012年09月03日 ⁄ 综合 ⁄ 共 1932字 ⁄ 字号 评论关闭
Question:

What's the difference between "redirect" & "forward" in servelt?

Answer:

Suppose you have a servlet that just does another redirect to another URL:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
  response.sendRedirect("/anotherURL");
}

This servlet is accessible through the URL /redirectServlet.

When the client browser makes a request for /redirectServlet, it receives a response (an HTTP 302 response) that tells it that the document it requested can actually be found at /anotherURL. The client uses the URL it gets and makes a new request to /anotherURL.

The redirect URL doesn't have to be on the same server as the original URL. If the redirect URL (/anotherURL) points to another servlet, new request and response objects will be created to handle the new request.

Suppose our redirect servlet is now changed to do a forward instead of a redirect:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
{
  ServletContext context = getServletContext();
  RequestDispatcher dispatcher = context.getRequestDispatcher("/anotherURL");
  dispatcher.forward(request, response);
}

This modified servlet is accessible through the URL /forwardServlet.

When the client makes a request to our forwarding servlet this time, it no longer receives the redirect response. The dispatcher.forward line causes the servlet container to run the servlet associated with the url /anotherURL directly. The client will receive the result of /anotherURL, even though they requested /forwardServlet.

A few more notes:

* Redirect is a two step process. The web server tells the browser to request a second URL.
* If the user reloads, the second URL will be reloaded (/anotherURL instead of /redirectServlet).
* Redirect is always slower than a forward because it requires a second client request.
* Attributes placed in the request scope of the redirecting servlet are not available in the request scope of the second rrequest.

* Forwards are performed internally to the web server.
* The browser is completely unaware that the forward took place - the original URL (/forwardServlet) remains in the address bar.
* If the user does a reload, the browser will repeat the original request with the original URL (/forwardServlet).

抱歉!评论已关闭.