请求转发和重定向区别

2023-11-05

一、转发和重定向区别详解

作为一名程序员,特别是java web开发的程序员,在使用servlet/jsp的时候,我们必须要知道实现页面跳转的两种方式的区别和联系:即转发和重定向的区别。

  1. RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
  2. 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  3. HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的 访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复, “浏览器”也知道他借到的钱出自李四之手。RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发 出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。
  4. RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。
  5. 无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中。

二、转发和重定向的图解

在这里插入图片描述

三、两种跳转获得对象的方式


//获得转发对象getRequestDispatcher()
HttpServletRequest(httpServletRequest).getRequestDispatcher
ServletContext.getRequestDispatcher();
 
//获得重定向对象sendRedirect()
HttpServletResponse(httpServletResponse).sendRedirect();

四、转发和跳转的小结

  1. 转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();
  2. 转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;
  3. 转发是服务器行为,重定向是客户端行为;
  4. 转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;
  5. 转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围);

五、转发和重定向的选择

  1. 重定向的速度比转发慢,因为浏览器还得发出一个新的请求,如果在使用转发和重定向都无所谓的时候建议使用转发。
  2. 因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。

六、转发和重定向的应用场景

在上面我已经提到了,转发是要比重定向快,因为重定向需要经过客户端,而转发没有。有时候,采用重定向会更好,若需要重定向到另外一个外部网站,则无法使用转发。另外,重定向还有一个应用场景:避免在用户重新加载页面时两次调用相同的动作。

例如,当提交产品表单的时候,执行保存的方法将会被调用,并执行相应的动作;这在一个真实的应用程序中,很有可能将表单中的所有产品信息加入到数据库中。但是如果在提交表单后,重新加载页面,执行保存的方法就很有可能再次被调用。同样的产品信息就将可能再次被添加,为了避免这种情况,提交表单后,你可以将用户重定向到一个不同的页面,这样的话,这个网页任意重新加载都没有副作用;

但是,使用重定向不太方便的地方是,使用它无法将值轻松地传递给目标页面。而采用转发,则可以简单地将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户端,所以Model中的一切都会在重定向时丢失。但幸运的是,在Spring3.1版本以后,我们可以通过Flash属性,解决重定向时传值丢失的问题。

要使用Flash属性,必须在Spring MVC的配置文件中添加一个。然后,还必须再方法上添加一个新的参数类型:org.springframework.web.servlet.mvc.support.RedirectAttributes。

如下所示:

@RequestMapping(value="saveProduct",method=RequestMethod.POST)
public String saveProduct(ProductForm productForm,RedirectAttributes redirectAttributes){
 
     //执行产品保存的业务逻辑等
  
     //传递参数
     redirectAttributes.addFlashAttribute("message","The product is saved successfully");
   
     //执行重定向
     return "redirect:/……";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Sonar常见问题修改

    Sonar常见问题修改 1 SonarLint简介与安装 1 1 SonarLint简介 1 2 SonarLint安装与配置 1 2 1 IDEA 插件在线安装 1 2 2 IDEA 插件离线安装 1 2 3 SonarLint Gene
  • 响应式编程介绍

    响应式编程简介 原文 你应该对响应式编程这个新事件有点好奇吧 尤其是与之相关的部分框架 Rx Bacon js RAC等等 在缺乏好的资源的情况下 学习响应式编程成为痛苦 我开始学的时候 做死地找各种教程 结果发现有用的只是极少部分 而且这
  • Java Excel转图片

    1 在pom xml添加依赖
  • 秒懂边缘云

    作者 辰舒 背景 当下 各类门户网站 短视频 剧集观看 在线教育等内容生态快速发展 互联网流量呈现爆发式增长 在靠近用户的地方就有CDN节点 用户通过手机或PC畅快浏览网页 视频 图片时 都需要CDN提供加速 作为经历二十多年发展的技术 C
  • 数据库连接的两种实现方式(读取配置文件)——DBCP&C3P0;DBCP实现连接代码,C3P0实现连接代码——包含完整代码

    两种数据库连接实现方式 第一种方式 DBCP DBCP使用流程 导jar包 使用DBCP创建数据库连接对象 DataSource ds BasicDataSourceFactory createDatasource 一个存储连接信息的pro
  • Android开发安卓10不显示通知栏Notification不显示NotificationManager.notify无效通知栏不显示

    Android8 0以上得加channelId Intent intent new Intent SplashActivity this ChatActivity class PendingIntent pendingIntent Pend
  • 学习django心得(一)

    学习django心得 一 说明 该文章用于博主记录学习心得和主要学习收获 学习材料大多来自刘江的博客教程 本文也就是它教程的概括 感兴趣的同学可以前往学习 ps 常见API原博客教程解释得很详细 时间 2020 3 1 学习内容 Djang
  • JAVA图像处理

    一 图像原理 图像是由一个个像素点组成的矩阵形成的 每个像素点的大小是1 int 32bit 4个字节分别对应A R G B 0 255byte 0000 0000 A 0000 0000 R 0000 0000 G 0000 0000 B
  • React入门-React的特点,React脚手架搭建工程

    React的特点 轻量 React的开发版所有源码 包含注释 仅3000多行 原生 所有的React的代码都是用原生JS书写而成的 不依赖其他任何库 易扩展 React对代码的封装程度较低 也没有过多的使用魔法 所以React中的很多功能都
  • spring

    spring 解决企业应用开发
  • Axure中引用javascript代码

    Axure支持原生javascript语法调用 Axure中默认的javascript位置存放在Axure安装目录axureRP DefaultSettings Prototype Files resources scripts文件夹下 如
  • Kubernetes 之深入理解 StatefulSet

    文章目录 StatefulSet 的由来 有状态应用 StatefulSet 的设计思想 拓扑状态 Headless Service 如何维持应用实例的拓扑状态 存储状态 Persistent Volume Claim PVC 其实就是一种
  • 安信可蓝牙PB-02 SDK二次开发记录

    目录 1 开发环境 烧录调试 2 例程踩坑 1 编译烧录 watchdog 例程 1 开发环境 烧录调试 详细参考下面两篇教程 安信可PB 01 02模组专题 PB 01 02模组开发板应用 BLE UART固件的使用教程 安信可PB 01
  • Linux系统与管理 - (九)系统初始化进程文件及服务[结]

    目录 自说 学习路径 init进程 systemd进程 服务管理 自说 本章是linux系统与管理的最后一章 系统初始化进程文件与服务管理 其实只要用心 基本知识也就是呢么多 最重要的如何灵活运用 日积月累 以小积多 不断的扩充自己的知识
  • MySQL数据库(九) 集群 Cluster 和性能优化

    文章目录 6 MySQL 集群 Cluster 6 1 MySQL主从复制 6 1 1 主从复制架构和原理 6 1 2 实现主从复制配置 6 1 3 主从复制相关 6 1 4 实现级联复制 6 1 5 主主复制 6 1 6 半同步复制 6
  • JMeter压测,跨线程组传递参数,设置全局变量

    1 测试计划中 勾选独立运行线程组选项 必须勾选 否则不能传参 2 正则表达式取出要传递的参数 3 添加一个BBeanShell 后置处理器 4 setProperty global token token 其中 global token是
  • 不能初始化数据库支持endnote_EndNote正确恢复数据库方法

    EndNote正确恢复数据库方法 EndNote有个恢复数据库功能 Recover Library 当EndNote的数据库Library受损或者打不开时 利用Recover Library可能是最后的一颗救命稻草 但是EndNote的Re
  • 2020-10-31

    实验一 系统环境 Kali Linux 2 Windows网络环境 交换网络结构实验工具 Metasploitable2 需自行下载虚拟机镜像 Nmap Kali WinHex 数据恢复软件等 实验步骤 1 用搜索引擎Google或百度搜索
  • MyISAM 和 InnoDB 讲解

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型 这两个表类型各有优劣 视具体应用而定 基本的差别为 MyISAM类型不支持事务处理等高级处理 而InnoDB类型支持 MyISAM
  • 请求转发和重定向区别

    一 转发和重定向区别详解 作为一名程序员 特别是java web开发的程序员 在使用servlet jsp的时候 我们必须要知道实现页面跳转的两种方式的区别和联系 即转发和重定向的区别 RequestDispatcher forward方法