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

Raj*_*Raj 19 java redirect servlets forward

RequestDispatcher's forward()HttpServletResponse's sendRedirect()方法有什么区别?
任何人都可以通过实例解释这些方法的示例和最佳用法吗?

dov*_*mir 19

重定向是一种发送回客户端的响应,而前向委派完全在服务器端进行,而前向操作的结果返回给客户端,就好像它只来自原始URL一样.

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

例子:

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


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


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


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

  • 注意:你可以做 `response.sendRedirect("http://www.google.com");` 但不能做 `HttpRequest.getRequestDispatcher("http://www.google.com");` 除非 google.com 驻留在您的服务器上。结论:`forward()`方法在服务器端工作,而`sendRedirect()`方法在客户端工作。 (2认同)

Sam*_*azi 6

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

签名:void sendRedirect(String url)

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

Forward ():这个方法是在RequestDispatcher接口中声明的。

签名:转发(ServletRequest请求,ServletResponse响应)

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

RequestDispatcher的向前()用于转发到另一个资源而ServletResponse的的sendRedirect(相同的请求)是一个两个步骤的过程。在 sendRedirect() 中,Web 应用程序将响应返回给客户端,状态码为 302(重定向),并带有 URL 以发送请求。发送的请求是一个全新的请求。

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

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

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

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

详细解释在这里