Java response.sendRedirect()和request.getRequestDispatcher().forward(请求,响应)之间的区别是什么

Java response.sendRedirect()和request.getRequestDispatcher().forward(请求,响应)之间的区别是什么,java,jsp,request,response,forward,Java,Jsp,Request,Response,Forward,当我使用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(“购物”是我的模块名称)

当我使用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
(“购物”是我的模块名称)


区别是什么?

简单地解释一下区别

  response.sendRedirect("login.jsp");
不在contextpath前加前缀(指绑定servlet的应用程序/模块)

但是,鉴于

 request.getRequestDispathcer("login.jsp").forward(request, response);
将在相应应用程序的上下文路径前加前缀

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


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

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


2.将请求转发到另一个servlet(servlet到servlet)。

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

forward

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

重定向

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

例如,sendRedirect可以将控制权从转移到,但forward不能这样做

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

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

只是
转发
(ServletRequest请求,ServletResponse响应)和
发送重定向
(字符串url)之间的区别是

forward():

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

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

  • 谢谢!这对我帮助很大!你能告诉我“prepend the contextpath”是什么意思吗?它指的是
    login.jsp
    绑定到的Web应用程序根路径,如果
    重定向
    请求返回到浏览器并显示在
    url
    中,这似乎你提到了
    url
    visa反之亦然。请编辑这个问题。