RequestDispatcher.forward()和HttpServletResponse.sendRedirect()有什么区别?

25
RequestDispatcherforward() 方法和 HttpServletResponsesendRedirect() 方法有什么区别?请举一个实际的例子来解释并说明这些方法的最佳使用方法。
4个回答

22

重定向是一种发送回客户端的响应类型,而转发代理完全在服务器端进行,转发操作的结果返回给客户端,就像它只来自原始URL一样。

另一个区别是,转发代理只能用于应用程序资源,而重定向命令可以将客户端浏览器重定向到当前域之外。

示例:

// Sends a temporary redirect to the HTTP client. Only absolute URLs are allowed.
ServletResponse.sendRedirect(String location);


// Delegates one HttpRequest to another dynamic or static resource
HttpRequest.getRequestDispatcher("example.jsp").forward(request, response);


// Includes/enriches current response with another dynamic or static resource
HttpRequest.getRequestDispatcher("example.html").include(request, response);


这里还可以找到另一个好的解释:
sendRedirect() 和 forward() 的区别


2
注意:你可以使用 response.sendRedirect("http://www.google.com"); 但不能使用 HttpRequest.getRequestDispatcher("http://www.google.com");,除非 google.com 存在于你的服务器上。结论:forward() 方法在服务器端起作用,而 sendRedirect() 方法在客户端起作用。 - KNU

6

SendRedirect():
该方法在HttpServletResponse接口中声明。

签名:void sendRedirect(String url)

该方法用于将客户端请求重定向到其他位置进行进一步处理,新位置可以位于不同的服务器或不同的上下文中。我们的Web容器会处理此操作并使用浏览器传输请求,此请求在浏览器中显示为新请求。有时也称为客户端重定向。

Forward():
该方法在RequestDispatcher接口中声明。

签名:forward(ServletRequest request, ServletResponse response)

该方法用于将请求传递给另一个资源以便在同一服务器内进行进一步处理,另一个资源可以是任何servlet、jsp页面或任何类型的文件。当我们调用forward方法时,Web容器会处理此过程,请求被发送到另一个资源而无需通知客户端,哪个资源将处理请求已在requestDispatcher对象上指定,我们可以通过两种方式获取该对象,即使用ServletContext或Request。这也称为服务器端重定向。

A RequestDispatcher forward()用于将同一请求转发到另一个资源,而ServletResponse sendRedirect()是一个两步过程。在sendRedirect()中,Web应用程序返回带有状态代码302(重定向)和URL的响应以发送请求。发送的请求是全新的请求。

B forward()由容器内部处理,而sendRedirect()由浏览器处理。

C 当访问同一应用程序中的资源时,我们应该使用forward(),因为它比需要额外网络调用的sendRedirect()方法更快。

D 在forward()中,浏览器不知道实际处理资源,并且地址栏中的URL保持不变,而在sendRedirect()中,地址栏中的URL更改为转发的资源。

E forward()不能用于调用另一个上下文中的servlet,在这种情况下,我们只能使用sendRedirect()。

详细解释请点击此处


3

只有当请求转发到的另一个servlet位于同一应用程序中时,我们才能使用请求调度程序。另一方面,如果两个servlet位于同一应用程序或不同应用程序中,都可以使用Send Redirect。


2

请求转发只将请求转发到同一WEB应用程序组件,而重定向也可以在不同的应用程序资源中将其重定向到同一站点,甚至可以指向绝对URL。

重定向可以看到目标页面的URL,页面URL转发只能看到第一次访问,毕竟有一个服务器来处理工作。

调用方和被调用方对象之间的请求响应共享相同的请求和响应对象,重定向时,调用方和被调用方属于两个独立的访问请求和响应过程。

必须在跳转重定向返回后添加,否则虽然可以跳转页面,但也会执行跳转语句后面的语句,转发执行跳转页面,下面的代码将不会被执行。


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