请求转发(forward)

一个web资源接收到客户端请求后,通知浏览器去调用另外一个web资源进行处理,称之为请求转发。

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

重定向(redirect)

一个web资源接收到客户端请求后,通知浏览器去访问另外一个web资源,称之请求重定向。

间接转发方式,有时也叫重定向,它一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。在Servlet中,通过调用response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL,示例代码如下:

Servlet中处理get请求的方法public void doGet(HttpServletRequest request,HttpServletResponse response){//请求重定向到另外的资源 response.sendRedirect("重定向的URL");}

重定向过程:

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

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
  3. 浏览器向servlet2发出请求;
  4. 最终由Servlet2做出响应。

请求转发和重定向的区别

1.定义不同

请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求,转发给目标地址,再将目标地址返回的结果转发给客户端,而客户端对于这一切毫无感知的。

这就好比,张三(客户端)找李四(服务器端)借钱,而李四没钱,于是李四又去王五那借钱,并把钱借给了张三,整个过程中张三只借了一次款,剩下的事情都是李四完成的,这就是请求转发。

请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回了一个临时响应头,这个临时响应头中记录了,客户端需要再次发送请求(重定向)的 URL 地址,客户端再收到了地址之后,会将请求发送到新的地址上,这就是请求重定向。

这就好像张三(客户端)找李四(服务器端)借钱,李四没钱,于是李四就告诉张三,“我没钱,你去王五那借“,于是张三又去王五家借到了钱,这就是请求重定向。

2.请求方不同

从上面请求转发和请求重定向的定义,我们可以看出:请求转发是服务器端的行为,服务器端代替客户端发送请求,并将结果返回给客户端;而请求重定向是客户端的行为,它们的交互流程,如下图所示:

3.数据共享不同

请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。

4.最终 URL 地址不同

请求转发是服务器端代为请求,再将结果返回给客户端的,所以整个请求的过程中 URL 地址是不变的;而请求重定向是服务器端告诉客户端,“你去另一个地访问去”,所以浏览器会重新再发送一次请求,因此客户端最终显示的 URL 也为最终跳转的地址,而非刚开始请求的地址,所以 URL 地址发生了改变。

5.代码实现不同

在 SpringBoot 中,请求转发的实现代码如下:

@RequestMapping("/fw") public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/index.html").forward(request, response); } 复制代码 12345

而请求重定向的实现代码如下:

@RequestMapping("/rt") public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException { response.sendRedirect("/index.html"); } 复制代码 12345

总结

请求转发和请求重定向遵循的是“字越少,事越大”的原则,“请求转发”的字比较少,它需要代客户端执行跳转;而“请求重定向”字比较多,它啥也不干,只是告诉客户端“你去别的地儿访问”就行了,这就是理解这两个概念的关键。它们的区别主要体现在 5 个点:定义不同、请求方不同、数据共享不同、最终 URL 地址不同、代码实现不同。

请求转发和重定向的理解和区别相关推荐

  1. 请求转发与重定向到底有哪些区别?

    一. 前言 我们知道,Web开发中的页面跳转,通常有两种跳转方式:重定向与请求转发.但可能有很多同学并不知道这两种跳转在细节上的区别,只知道都能跳转到目标页面.但实际上这两种跳转方式深入研究后,你会发 ...

  2. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...

    原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 ServletRequest 基本概念 ...

  3. 请求转发与重定向的区别和执行流程

    请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...

  4. 请求转发和重定向的区别以及什么时候使用

    请求转发和重定向的区别以及什么时候使用 转发过程(不改变网址) 客户浏览器发送http请求-->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作-->将 ...

  5. jsp:请求转发和重定向

    HttpServletResponse对象的sendRedirect(String location)方法称作重定向, 如果location地址前面加上"/",则表示相对于Serv ...

  6. 浅析请求转发和重定向

    浅析请求转发和重定向 1.请求转发 request.getRequestDispather("/indexServlet").forword(request,response); ...

  7. 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

    三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...

  8. 【Servlet】请求转发与重定向

    重定向 重定向是指由原请求地址重新定位到某个新地址,原有的request请求失效,客户端看到的是新的request请求返回的响应结果,客户端浏览器地址栏变为新请求地址. 一次重定向过程存在两次请求和两 ...

  9. 详解请求转发和重定向

    ** 详解请求转发和重定向 **servlet请求转发与重定向的区别: request.setAttribute("test","hello"); reques ...

最新文章

  1. Educational Codeforces Round 30 A
  2. 如何利用魔棒工具抠图_3秒搞定抠图!免费在线抠图工具
  3. XML解析之dom4j
  4. find vba 模糊_VBA积木代码方案:实现多重查找、模糊查找、清除值
  5. 介绍一些知识图谱的实际应用类项目
  6. 7.2图的存储结构(十字链表、邻接多重表、边集数组)
  7. VS设置程序启动权限为管理员权限
  8. child pid xxx exit signal Segmentation fault (11)
  9. 【数据结构】堆、堆排序笔记
  10. [PYTHON]python 基础笔记(1)
  11. python爬取知乎文章_selenium+python+BeautifulSoup爬取知乎文章信息
  12. 最全国内外文献检索网站收集
  13. linux系统ping地址端口,linux ping 带端口
  14. 机载激光雷达原理与应用科普(三)
  15. 数据同步工具Sqoop
  16. 无须数据线,实现电脑手机快速互传
  17. Python简单木马编写
  18. 备考软考高级系统架构设计师需要看哪些书?
  19. st_link v2制作流程
  20. 使用循环语句判断月份是31天还是30天?

热门文章

  1. LEACH路由协议仿真(基于MATLAB)
  2. 焊接电流检测仪TK6700电焊机电量参数综合校验仪
  3. Redhat联网及配置网络yum
  4. Android全球定位系统GPS使用教程大全-刘宇
  5. 智能镜——5.应用入口及触摸按键实现篇
  6. 《概率机器学习导论》最新版,谷歌大牛KevinMurphy最新863页pdf巨作
  7. 电容的种类及识别方法
  8. mybatis源码编译出现问题
  9. jieba库、wordcloud库
  10. java毕业设计校园快递代领系统mybatis+源码+调试部署+系统+数据库+lw