response.sendRedirect()和request.getRequestDispatcher().forward(request,response)之间有什么区别?

55

我在使用JAVA时遇到了页面跳转的问题,如果我使用:

response.sendRedirect("login.jsp")

然后我得到了这个URL:http://localhost:8080/login.jsp

但如果我使用

request.getRequestDispathcer("login.jsp").forward(request, response)

然后我得到了这个URL:http://localhost:8080/Shopping/login.jsp (其中"Shopping"是我的模块名称)。

有什么区别吗?


如果重定向请求回到浏览器并在URL中显示,这似乎是您相反地提到了URL,请编辑问题。 - user4768611
5个回答

84

简单地解释一下区别:

  response.sendRedirect("login.jsp");

不会添加上下文路径(指封装servlet的应用程序/模块)

但是,然而

 request.getRequestDispathcer("login.jsp").forward(request, response);

将预先添加应用程序的上下文路径

此外,重定向请求用于将资源重定向到不同的服务器或域。容器通过委托浏览器来执行该控制任务。也就是说,重定向发送一个头文件回到浏览器/客户端。该头文件包含要由浏览器重定向的资源URL。然后浏览器发起对给定URL的新请求。

转发请求用于将调用方可用的资源转发到所在服务器。容器内部完成此控制传递,并且浏览器/客户端不参与其中。


非常感谢!这对我帮助很大! - roger
你能告诉我"prepend the contextpath"是什么意思吗? - Все Едно
它意味着login.jsp捆绑在其中的Web应用程序根路径。 - Keerthivasan

16

转发

在服务器内部资源可供调用时,可以将控制权转发给这些资源。容器会在内部进行控制权的交换,浏览器/客户端不参与其中。这是转发和重定向之间的主要区别。转发完成后,原始请求和响应对象以及必要的其他参数会一同传递。

重定向

控制权可以被重定向到位于不同服务器或域中的资源。容器将此任务委托给浏览器,即重定向将一个头部发送回浏览器/客户端。该头部包含被浏览器重定向的资源 URL。然后,浏览器开始向给定的 URL 发起新请求。由于这是一个新的请求,旧的请求和响应对象会丢失。

例如,sendRedirect 可以从 http://google.com 转移控制权到 http://anydomain.com,但是 forward 无法做到这一点。

无论是转发还是重定向,都不会丢失 'session'。

为了感受转发和重定向之间的差异,请查看您浏览器的地址栏, 在转发中,您将无法看到转发的网址(因为浏览器没有参与) 在重定向中,您可以看到被重定向的网址。


16

forward()方法和sendRedirect()方法的主要区别在于,对于forward()方法,重定向是在服务器端进行的,客户端看不到;但对于sendRedirect()方法,重定向是在客户端进行的,客户端可以看到。

Forward(ServletRequest request, ServletResponse response)sendRedirect(String url)之间的其他区别:

forward():

  1. forward()方法在服务器端执行。
  2. 请求被转移到同一服务器内的另一个资源中。
  3. 由于forward()方法是由Servlet容器提供的,因此它不依赖于客户端的请求协议。
  4. 请求由目标资源共享。
  5. 该方法只消耗一次调用。
  6. 它可以在服务器内部使用。
  7. 我们无法看到转发的消息,它是透明的。
  8. forward()方法比sendRedirect()方法快。
  9. 它在RequestDispatcher接口中声明。

sendRedirect():

  1. sendRedirect()方法在客户端执行。
  2. 请求被传输到不同服务器的另一个资源。
  3. sendRedirect()方法在HTTP下提供,因此只能与HTTP客户端一起使用。
  4. 为目标资源创建新的请求。
  5. 会消耗两次请求和响应调用。
  6. 它可以在服务器内外使用。
  7. 我们可以看到重定向的地址,它不是透明的。
  8. sendRedirect()方法较慢,因为当创建新请求时,旧请求对象将丢失。
  9. 它在HttpServletResponse中声明。

哪个更好?它取决于哪种方法更有用的情况。

如果您想要控制转移至新服务器或上下文,并将其视为完全新的任务,则选择sendRedirect

一般情况下,如果操作可以在网页重新加载后安全地重复执行且不会影响结果,则应使用前进。


6

1.重定向是将请求从服务器返回到浏览器,然后由浏览器重新将请求发送到服务器。

2.转发是将请求发送到另一个Servlet(从一个Servlet到另一个Servlet)。


2

重定向和请求分发是两种不同的方法,用于从一个页面移动到另一个页面。 如果我们使用重定向到一个新页面,实际上客户端自身会发起一个新的请求到新页面。 因此我们可以看到URL的变化。 由于重定向是一个新的请求,旧的请求值在这里不可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接