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


    在这里插入图片描述HTTP中的重定向和请求转发的区别
    转发是服务器行为,重定向是客户端行为
    重定向的编码是 302;
    转发的编码是307;

    二者通俗解释

    假设你去办理某个执照,

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

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

    页面跳转:转发

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

    • 转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
    • 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 → 将目标资源发送给客户。
     //java代码示例
    request.getRequestDispatcher("xxx.jsp或者servlet").forward(request,response);
    
    • 1
    • 2

    在这里插入图片描述在这里插入图片描述

     在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%>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    案例

    实现从OneServlet中转发到TwoServlet

    • OneServlet向请求域中添加了一个键和值,转发给TwoServlet
    • TwoServlet就从请求域中取出键和值,打印到浏览器上。
    地址栏不发生变化,显示的是上一个页面的地址
    请求次数:只有1次请求
    根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
    请求域中数据不会丢失
    
    • 1
    • 2
    • 3
    • 4
    request.getRequestDispatcher("/地址").forward(request, response);
    
    • 1

    重定向

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

    • 客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 → 客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址
      → 服务器根据此请求寻找资源并发送给客户。
    //java代码示例
    response.sendRedirect("xxx.jsp或者servlet");
    
    
    • 1
    • 2
    • 3
    • 重定向,其实是两次request,
      第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。

    由浏览器端进行的页面跳转

    在这里插入图片描述在这里插入图片描述 特点:地址栏:显示新的地址
    请求次数:2次
    根目录:http://localhost:8080/ 没有项目的名字
    请求域中的数据会丢失,因为是2次请求

    问:什么时候使用转发,什么时候使用重定向?
    
    如果要保留请求域中的数据,使用转发,否则使用重定向。
    
    以后访问数据库,增删改使用重定向,查询使用转发。
    
    问:转发或重定向后续的代码是否还会运行?
    
    无论转发或重定向后续的代码都会执行
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二者对比:

    在这里插入图片描述

    二者区别:

    1.转发是服务器行为,重定向是客户端行为
    2.重定向是两次请求的过程,而转发只有一次.由此可见重定向是由浏览器完成的,转发是服务器内部完成的。
    3.在重定向的过程中,传输的信息会被丢失。
    转发中传输的信息不会丢失。
    4.重定向会改变地址栏的内容,转发不会
    ################
    1.重定向访问服务器两次,转发只访问服务器一次。
    2.重定向可以看见目标页面的URL,转发只能看见第一次访问的页面URL,以后的工作都是有服务器来做的。
    3.重定向跳转后必须加上return,要不然页面虽然跳转了,但是还会执行跳转后面的语句,转发是执行了跳转页面,下面的代码就不会在执行了。
    4.在request级别使用信息共享,使用重定向必然出错
    5.还有一个大的区别就是,重定向可以访问自己web应用以外的资源

  • 相关阅读:
    编译 --> 链接
    cmd和PyCharm如何调用电脑中有多个版本Python
    5:第二章:架构后端项目:1:【传统开发模式】和【前后端分离开发模式】,简述;
    前端TypeScript学习-交叉类型与泛型
    [附源码]计算机毕业设计JAVA房屋租赁管理系统
    数据库设计三大范式
    Spring 源码阅读 74:事务管理的原理 - BeanFactoryTransactionAttributeSourceAdvisor 分析
    百度收录量查询易语言代码
    5G LDPC polar 3GPP 定案过程
    软件的生命周期(软件工程各阶段的工作)
  • 原文地址:https://blog.csdn.net/qq_41810415/article/details/126240542