HTTP中的重定向和请求转发的区别

一、调用方式

我们知道,在servlet中调用转发、重定向的语句如下:

request.getRequestDispatcher("new.jsp").forward(request, response);   //转发到new.jsp

response.sendRedirect("new.jsp");   //重定向到new.jsp

在jsp页面中你也会看到通过下面的方式实现转发:

<jsp:forward page="apage.jsp" />

当然也可以在jsp页面中实现重定向:

<%response.sendRedirect("new.jsp"); %> //重定向到new.jsp

二、本质区别

解释一

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

解释二

重定向,其实是两次request

第一次,客户端request   A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

例子:

response.sendRedirect("loginsuccess.jsp");

请求转发是服务器内部把对一个request/response的处理权,移交给另外一个

对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。

例子:

RequestDispatcher dis=request.getRequestDispatcher(“loginsuccess.jsp”);

Dis.forward(request,response);

解释三

假设你去办理某个执照

重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。

转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。

时间: 2024-12-28 21:01:59

HTTP中的重定向和请求转发的区别的相关文章

举例说明重定向和请求转发的区别

重定向 HttpServletResponse对象的sendRedirect(java.lang.String location)方法称作重定向. 如果location地址前面加上“/”,则表示相对于Servlet容器的根来请求,比如http://localhost:8080:如果location地址前面没有加上“/”,则表示相对于当前请求的URI来寻找地址. 请求转发 RequestDispatcher的:forward(ServletRequest request, ServletRespo

请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层).View(视图层).Controller(控制层). Model是可作为JavaBean使用的业务对象:View是负责创建显示界面的JSP页面:Controller通常是一个接收用户请求的Servlet程序,它根据请求创建相应的model对象和调用model对象的业务方法,最后再选择一个View去创建网页文档内容并回送给客户端. Controller调用RequestDispatc

重定向和请求转发的区别

整个请求转发过程中共一次请求     整个请求转发过程中地址栏没有改变(不能访问外网)     整个请求转发过程中请求参数依然有效     请求转发之后的代码能否执行???--->可以执行,但是有风险,一般用return解决风险      整个重定向过程中共两次请求     整个重定向过程中地址栏改变了(能访问外网)     整个重定向过程中请求参数全部消失,(如果需要参数的话,只能手动设置)     重定向之后的代码能否执行???--->可以执行,但是有风险,一般用return解决风险   

请求重定向和请求转发的区别

1)转发只能将请求给同一个WEB应用中的组件:重定向可以重定向到一个站点上的其它应用程序的资源,还可以使用绝对URL重定向到其它站点的资源. 2)重定向需要的路径是针对浏览器的,也就是说相对URL以"/"开头,它是相对于整个WEB站点的根目录:转发需要的路径是相对于服务器的,也就是说相对URL以"/"开头,它是相对于当前WEB应用程序的根目录. 3)重定向浏览器地址栏发生变化:转发浏览器地址栏不发生变化.这是因为重定向对浏览器的请求直接作出响应,然后让浏览器去访问它

3--springMVC中redirect重定向和forward转发的区别---一些简单的问题的解决

https://www.cnblogs.com/conswin/p/6973528.html SpringMvc请求方式分为转发.重定向两种,是用forward和redirect关键字在controller层进行处理. 下面代码实现了这两种不同的请求方式: import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.stereotyp

重定向与请求转发的区别

req.getRequestDiapatcher("hello.jsp").forward(req,resp);//重定向 resp.sendRedirect("login.jsp");//请求转发 重定向,服务器内部跳转.一次请求,跳转一次.Url不变. 请求转发,一次请求,2次跳转.请求的Url变成跳转成功的Url.

请求重定向与请求转发的区别

请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变.请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变.

JSP内置对象---请求重定向与请求转发的区别

视频地址:http://www.imooc.com/video/3306 方便理解:

【Servlet】深入浅出Java重定向和请求转发

import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; import com.bjpowernode.exam.model.*; import com.bjpowernode.exam.manager.*; public class SearchStudentServlet extends HttpServlet { public