异同

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.
redirect:低.

本质区别

解释

 Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

  直接转发方式(Forward),服务器端行为。客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。

  间接转发方式(Redirect),客户端行为。实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

举个通俗的例子:

  直接转发就相当于:“A找B借钱,B说没有,B去找C借,借到借不到都会把消息传递给A”;

  间接转发就相当于:"A找B借钱,B说没有,让A去找C借"。

下面详细阐述一下两者的原理:

直接请求转发(Forward)  

 直接转发方式用的更多一些,一般说的请求转发指的就是直接转发方式。

Web应用程序大多会有一个控制器,由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。

  javax.serlvet.RequestDispatcher接口是请求转发器必须实现的接口,由Web容器为Servlet提供实现该接口的对象,通过调用该接口的forward()方法到达请求转发的目的,示例代码如下:

......//Servlet里处理get请求的方法public void doGet(HttpServletRequest request , HttpServletResponse response){//获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置RequestDispatcher requestDispatcher =request.getRequestDispatcher("资源的URL");//调用forward()方法,转发请求
   requestDispatcher.forward(request,response);
}......

   

上图所示的直接转发请求的过程如下:

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
  3. 最终由Servlet2做出响应。

技巧:其实,通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单击某一个超链接时,浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是间接的请求转发。相反,如果地址没有发生变化,则代表的是直接请求转发或者没有转发。

间接请求转发(Redirect)

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

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

 

上图所示的间接转发请求的过程如下:

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

问:直接转发和间接转发的原理及区别是什么?

答:Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法。——服务端转发  客户端转发

  对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。它本质上是两次HTTP请求,对应两个request对象。

  对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet、HTML、JSP或其它信息资源,由第2个信息资源响应该请求,两个信息资源共享同一个request对象。

forward过程

转发,服务器端行为。web服务器把接受的请求,调用内部的方法在容器内部完成请求处理和转发动作,然后响应客户端,在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。

redirect过程

重定向,客户端行为。客户端发送http请求,web服务器接受后发送3**状态码响应及对应新的location给客客户端,客户端发现是3**响应,则自动再发送一个新的http请求,请求url是新的location地址,在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。重定向行为是浏览器做了至少两次的访问请求的。

redirect和forward的区别相关推荐

  1. 小博老师解析经典Java面试题-redirect和forward的区别

    [面试原题] 简述java中redirect和forward的区别. [正确答案] redirect是url重定向,让客户端重新发送一次请求到另一个url.因此整个过程客户端向服务器发送了两次请求,并 ...

  2. Spring中redirect和forward的区别

    页面转发区别: 在Servlet中两种实现: forward方式:request.getRequestDispatcher("/somePage.jsp").forward(req ...

  3. jsp中redirect和forward的区别

    在网上看到一些帖子,总结了一些区别,可以从以下几个方面来看: 1.从地址栏显示来说 forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容 再发 ...

  4. redirect与forward跳转的区别

    2019独角兽企业重金招聘Python工程师标准>>> Servlet 跳转 redirect与forward跳转的区别 Servlet: 当然,在servlet中,一般跳转都发生在 ...

  5. unity------------------------------transform.forward与Vector.forward的区别

    在unity3d中有2个forward,一个是vector3.forward和transform.forward,这两个forward其实完全不一样.他们之间的区别主要体现在在不同坐标系时的反映上. ...

  6. java零碎要点---struts2中redirect和redirectAction的区别

    struts2中redirect和redirectAction的区别 struts2中关于result的返回类型一般我们是转发到一个jsp页面或者是html页面等,但是struts2中的result的 ...

  7. request的setAttribute()用法及request.sendRedirect 与 request.getRequestDispatcher.forward 的区别

    request.setAttribute()怎么用的? JSP1代码 String [] test=new String[2]; test[0]="1"; test[1]=&quo ...

  8. Unity3d vector3.forward和transform.forward的区别!

    在unity3d中有2个forward,一个是vector3.forward和transform.forward,这两个forward其实完全不一样.他们之间的区别主要体现在在不同坐标系时的反映上. ...

  9. 重定向和转发的区别(redirect和forward)

    redirect(重定向):改变地址 forward(转发):不改变地址 106本Python电子书 更多

最新文章

  1. SCOM2012R2 (5) MONITOR WINDOWS OF WORKGROUP
  2. e.printStackTrace()会导致锁死?这仅仅是打印,怎么可能?
  3. SAP销售订单-订单组合
  4. 0x80070003系统找不到指定路径_Win7系统中gpedit.msc找不到应该如何解决?
  5. Java无所不能的反射在Android中需要熟练的知识
  6. opencv3编程入门-毛星云
  7. 酷派无线升级服务器设置在哪里,酷派手机CDA自助升级线刷工具安装教程
  8. 访问php页面显示源码解决方法
  9. 怎么生成html链接,终于认识如何创建网页超链接
  10. 谷歌浏览器批量删除书签
  11. linux设备模型--sysfs
  12. 网络邻居看不到其他计算机,在网上邻居中看不到自己的电脑也看不到别人的解决方法...
  13. 关于在Mac上挂载移动硬盘实现数据备份的方法
  14. 【DL】第 11 章:自动驾驶汽车的深度学习
  15. 蓝牙产品做SRRC认证需要注意哪些事项?
  16. 捉急.. 挂在二叉树上下不来了
  17. I4mc-deep: 利用具有化学特性的深度学习方法,对 n4- 甲基胞嘧啶位点进行智能预测
  18. Creative的迷失与重生之路
  19. ORACLE DG概念及切换
  20. Image Retrieval: Ideas, influences, and trends of the new age 图像检索综述 文献翻译(一)

热门文章

  1. 2019年上半年收集到的人工智能卷积神经网络干货文章
  2. SAP EWM - 其他主数据 - 供应链单元
  3. 业界丨全球AI人才排行榜:美国第一,中国仅排名第7
  4. 深度好文丨区块链将彻底改变人工智能
  5. AI会让人类失业吗? 马云马化腾们不这么认为
  6. 想用Python学机器学习?Google大神替你写好了所有的编程示范代码
  7. python入门须知:包、模块、库的含义以及导入以及包下__init__.py的作用
  8. 向人类再进一步|MIT×UMich探索可以理解物体空间关系的人工智能
  9. 大脑活动与认知: 热力学与信息论的联系
  10. 窥见人工智能四十年 2019 CCF-GAIR全球人工智能与机器人峰会今日开幕