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

作为一名程序员,特别是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:/……";
}

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

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

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

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

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

  3. 请求转发和重定向的区别_WEB之重定向和请求转发的区别

    一次重定向的过程 我的代码里面已经写好了,redirectAndFoward.jsp页面上有一个表单,表单重定向到redirectAndFowardTarget.jsp,那么这一次的重定向过程为: 1 ...

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

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

  5. 请求转发和重定向的理解和区别

    请求转发(forward) 一个web资源接收到客户端请求后,通知浏览器去调用另外一个web资源进行处理,称之为请求转发. 转发过程:客户浏览器发送http请求---->web服务器接受此请求- ...

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

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

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

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

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

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

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

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

最新文章

  1. tcp reno 介绍
  2. 让我们回顾一下如何通过JDBC插入Clob或Blob
  3. 编程加速服务器_FPGA加速驱动新时代的数据洪流,下篇
  4. docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例
  5. 设计素材|美丽的几何和多边形背景纹理
  6. VMware View 要求操作句柄的状态错误
  7. linux tomcat 进程杀掉_测试开发人员必备Linux命令
  8. php可视化网页制作软件,PHPRunner(PHP网页制作)官方版
  9. eeglab和matlab,Matlab之EEGLAB工具箱脑电数据预处理
  10. 在没有QQ、微信时局域网共享文件方法
  11. 十、InnoDB的Buffer Pool
  12. 生物特征识别技术的安全性分析
  13. 10个有关快门的必学知识
  14. 计算机科学 在职双证,计算机专业在职研究生有双证的吗?
  15. 港媒:梁洛施偷吃排卵药擅生双胞胎 惹怒李泽楷
  16. ubuntu18.04解决问题:is not a supported wheel on this platform(已解决)--用python3.8安装crala0.9.13时出现
  17. java流程图中平行四边形代表什么_程序流程图中通常用平行四边形表示分支结构...
  18. 安卓7.0核心破解示列
  19. 我最喜欢的一位女明星哦!
  20. LeetCode 908 题解

热门文章

  1. 微信小程序使用websocket
  2. 宝玉的blog 专注于web开发技术
  3. java.lang.SecurityException: Unsupported path
  4. matlab实现泰森多边形
  5. 13980个性桌面导航
  6. MathJax的使用
  7. 好用压缩软件推荐 7 zip
  8. offsetTop,offsetLeft
  9. 为什么说流程自动化机器人是AI落地的“接盘侠”?
  10. 学习心得------Django通过配置使用mysql数据库