response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有啥区别 [重复]

Posted

技术标签:

【中文标题】response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有啥区别 [重复]【英文标题】:What is the difference between response.sendRedirect() and request.getRequestDispatcher().forward(request,response) [duplicate]response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有什么区别 [重复] 【发布时间】:2013-12-20 16:40:30 【问题描述】:

我在使用 JAVA 时出现页面跳转问题, 如果我使用:

response.sendRedirect("login.jsp")

然后我得到这个网址:http://localhost:8080/login.jsp

但是如果我使用

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

然后我得到这个网址:http://localhost:8080/Shopping/login.jsp(“购物”是我的模块的名称)。

有什么区别?

【问题讨论】:

如果redirect 请求返回浏览器并显示在url 中,这似乎你提到了url,反之亦然。请编辑问题。 【参考方案1】:

为了简单说明区别,

  response.sendRedirect("login.jsp");

不预先添加上下文路径(指捆绑 servlet 的应用程序/模块)

但是,而

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

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

此外,重定向请求用于将资源重定向到不同的服务器或域。这种控制任务的转移由容器委托给浏览器。也就是说,重定向将标头发送回浏览器/客户端。此标头包含要由浏览器重定向的资源 url。然后浏览器向给定的 url 发起一个新的请求。

转发请求用于转发到发出调用的服务器中可用的资源。这种控制转移由容器内部完成,不涉及浏览器/客户端。

【讨论】:

非常感谢!这对我帮助很大! 你能告诉我“预置上下文路径”是什么意思吗 表示login.jsp绑定的web应用根路径【参考方案2】:

前进

可以将控制权转发到进行调用的服务器中的可用资源。这种控制转移是由容器内部完成的,不涉及浏览器/客户端。这是 forward 和 sendRedirect 之间的主要区别。转发完成后,如果需要,原始请求和响应对象会连同其他参数一起传输。

重定向

控件可以重定向到不同服务器或域的资源。这种控制任务的转移由容器委托给浏览器。也就是说,重定向将标头发送回浏览器/客户端。此标头包含要由浏览器重定向的资源 url。然后浏览器向给定的 url 发起一个新的请求。由于是新请求,所以旧的请求和响应对象丢失了。

例如,sendRedirect 可以将控制权从 http://google.com 转移到 http://anydomain.com,但 forward 不能这样做。

“会话”在转发和重定向中都不会丢失。

要直观地感受 forward 和 sendRedirect 之间的区别,请查看浏览器的地址栏, 在转发中,您将看不到转发的地址(因为不涉及浏览器) 在redirect中可以看到重定向的地址。

【讨论】:

【参考方案3】:

forward() 和 sendRedirect() 方法的主要区别是 在 forward() 的情况下,重定向发生在服务器端,并且 对客户端不可见,但在 sendRedirect() 的情况下, 重定向发生在客户端,对客户端可见。

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

forward():

    forward() 方法在服务器端执行。 请求被转移到同一服务器内的另一个资源。 它不依赖于客户端的请求协议,因为 forward () 方法由 servlet 容器提供。 请求由目标资源共享。 此方法仅使用一次调用。 可以在服务器内使用。 我们看不到转发的消息,它是透明的。 forward() 方法比sendRedirect() 方法快。 在RequestDispatcher接口中声明。

sendRedirect():

    sendRedirect() 方法在客户端执行。 请求被转移到另一个资源到另一个服务器。 sendRedirect() 方法是在 HTTP 下提供的,因此它只能用于 HTTP 客户端。 为目标资源创建新请求。 消耗了两个请求和响应调用。 可以在服务器内外使用。 我们可以看到重定向的地址,它是不透明的。 sendRedirect() 方法速度较慢,因为创建新请求时旧请求对象丢失。 在 HttpServletResponse 中声明。

哪个好?要看场景,哪种方法更有用。

如果你想控制转移到一个新的服务器或上下文,它是 被视为一个全新的任务,然后我们去 sendRedirect。 一般来说,如果操作可以安全,应该使用前锋 在浏览器重新加载网页时重复,不会影响 结果。

【讨论】:

【参考方案4】:

1.redirect将请求从服务器返回给浏览器,然后再从浏览器重新发送请求给服务器。

2.forward将请求发送到另一个servlet(servlet to servlet)。

【讨论】:

【参考方案5】:

重定向和请求调度程序是从一个页面移动到另一个页面的两种不同方法。 如果我们使用重定向到新页面,实际上是从客户端本身到新页面发生新请求。 所以我们可以看到 URL 的变化。 由于重定向是一个新请求,因此旧请求值在此处不可用。

【讨论】:

以上是关于response.sendRedirect() 和 request.getRequestDispatcher().forward(request,response) 有啥区别 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

求教: response.sendRedirect(""); 的用法!!

求jsp中response.sendRedirect()实例;

response.sendRedirect传递参数和转向

response.sendRedirect() 有啥用?

急!关于response.sendRedirect传递中文参数

我遇到的response.sendRedirect跳转不了问题