重定向和转发的区别

2023-11-15

重定向和转发的区别

  1. 在代码上

    • 转发

      • // 第一步:获取请求转发器对象
         	RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
         	// 第二步:调用转发器的forward方法完成跳转/转发
         	dispatcher.forward(request,response);
                   
         	// 第一步和第二步代码可以联合在一起。
         	 request.getRequestDispatcher("/b").forward(request,response);
         	
        //注意:转发的时候是一次请求,会将当前的request和response对象传递给下一个servlet.
                 
        
    • 重定向

      • response.sendRedirect("servlet02/b")
        //注意:重定向地址需要加上 项目名
        //因为浏览器发送请求是需要加上项目名的
        
  2. 在形式上

    • 转发
      • 利用转发跳转页面后,会发现浏览器地址栏上,是第一次的访问地址。
      • 例如:我在AServlet上通过转发的方式跳转到BServlet,浏览器地址栏上写的是localhost:8080/servlet01/a
    • 重定向
      • 利用重定向跳转页面,会发现浏览器地址栏上,是最后一此跳转资源的访问地址
      • 例如:我在AServlet上通过转发的方式跳转到BServlet,浏览器地址栏上写的是localhost:8080/servlet01/b
  3. 在原理上

    • 转发
      • 转发的整个过程其实都是WEB服务器自己所完成,是由WEB服务器自己完成的跳转。浏览器只发送了一次请求
    • 重定向
      • 重定向是浏览器完成的。重定向是一个将地址响应给浏览器的过程,你可以从调方法时用的response对象就可以看出来,重定向是将需要跳转的地址发送给浏览器,浏览器接收到地址后,再次向服务器发送一次跳往该地址的请求。也就是说跳转到一个新的页面,浏览器发送了两次请求
  4. 注意:

    • 转发仍然还在一个请求域当中,而转发的话,到新资源后就不在同一个请求域当中了。
    • 浏览器发送请求地址一定要加项目名,所以在重定向里面写地址时,加上了项目名。
    • 转发在同一个请求当中,也就是说前一个和后一个Servlet必须有相同的处理方式,也就是说都重写了doGet或者都重写了doPost。
    • 而重定向是两次请求,也就是说第一次是get还是post于第二次请求没关系
  5. 如何选择转发和重定向

    • 如果前一个Servlet在请求域中绑定了数据,并且跳转到下一个Servlet需要取这个数据,就用转发
    • 其他情况都用重定向
  6. 转发会出现一个问题,比如有一个Servlet类,完成的是向数据库插入一个数据,插入成功后会跳转到一个新的页面,如果用转发的方式话,在新的页面上刷新浏览器时,会再次插一条数据到数据库当中,转发是一次请求,你在新页面刷新就是重新执行这个请求。 而如果用重定向则不会出现该问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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