请求转发和重定向

1、 定义

  • Forward(请求转向):服务器程序内部请求转向,这个特性允许前一个程序用于处理请求,而后一个程序用来返回响应。
  • Redirect(重定向):服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的URL,客户端用新的URL重新向服务器发送一个新的请求。

2、定义简单理解

  • 请求转发只是把请求转发给服务器上(通常是同一个Web应用中)的另一个组件(Servlet或Jsp等)。
  • 重定向则只是告诉客户(浏览器)去访问另一个URL(可能是同一个Web站点甚至其他站点)。

3、本质区别

  • 请求转发发生在服务器端,由服务器(比如servlet)控制。
  • 重定向发生在客户端,由客户(通常是浏览器)控制。

4、请求和响应次数

  • 请求转发过程在同一个请求当中完成,只会返回一个响应。
  • 重定向过程则发生在两个不同的请求中,会返回两个不同响应。

5、基于第4点,进一步分析

  • 请求转发后可以在服务器端获取本次请求对象上保存的信息(比如在Servlet中将用户名保存到当前request对象中,转发给另一组件(如JSP)后,另一组件可以通过request对象取得用户名信息)。
  • 请求转发后,浏览器地址栏URL不会发生改变。
  • 重定向后则无法在服务器端获取第一次请求对象上保存的信息(比如还是在Servlet中将用户名保存到当前request对象中,并重定向到一个新的URL,然后在新URL指向的地址中(比如还是某个Servlet)就无法获取原先保存在第一个请求中的信息。很明显,用户名是保存在第一次请求的对象中,但并没有保存在本次(第二次)请求的对象中)。
  • 重定向后,浏览器地址栏URL变为新的URL(因为浏览器确实给新的URL发送了一个新的请求)。

6、服务器端调用的方法

7、基于第6点,进一步分析

  • RequestDispatcher对象是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,所以forward()或include()本质来说是属于请求对象的方法,所以请求转发始终发生在一个请求当中。
  • sendRedirect()方法HttpServletResponse对象的方法,即响应对象的方法。既然调用了响应对象的方法,就表示本次请求过程已经结束了,服务器即将向客户端返回本次请求的响应了。事实上,服务器确实返回了一个状态码为“302”,首部“Location”值为新的URL的响应。然后浏览器就会根据“Location”首部指定的URL,重新发起一次新的请求,转向这个目标页面,所以重定向实际上发生在两个不同的请求当中。

8、sendRedirect()和forword()中使用相对URL分析(站点为:http://localhost:8080/,Web应用为MyApp)。

  • sendRedirect(URL):如果使用”/”开头,则表示相对于整个Web站点的根目录,如使用sendRedirect(“/foo/myHtml.html”)时,容器建立的完整URL为:http://localhost:8080/foo/myHtml.html。否则,就表示相对于当前目录。
  • request.getRequestDispatcher(URL).forward(req,res):如果使用”/”开头,则表示相对于当前Web应用的根目录,而非整个Web站点的根目录,如使用request.getRequestDispatcher(/foo/myHtml.html).forward(req,res)时,容器会建立绝对(完整)的URL为:http://localhost:8080/MyApp/foo/myHtml.html。否则,同样表示相对于当前目录。

9、跳转时机(有待考究)

  • 请求转发执行到跳转语句后马上无条件跳转,之后的代码不再执行。
  • 重定向则会在所有代码执行完毕后跳转,但不能再向response中写入任何数据。(可以在重定向跳转后加上return语句,实现马上跳转)

10、执行时机(相同点)

  • 请求转发和重定向方法都必须在响应提交(刷新响应正文输出到流中)之前执行,否则会抛出IllegalStateException异常。
  • 在转发或重定向之前,响应缓冲区中未提交的数据会被自动清除。

11、响应速度(理论上)

  • 请求转发相对快:因为请求转发过程在同一请求中。
  • 重定向相对慢:因为重定向过程发生在两个不同的请求中。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 一、请求转发和重定向 请求转发:request.getRequestDispatcher(URL地址).forwa...
    向右奔跑阅读 15,082评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,526评论 0 6
  • ​得人者得天下,所谓知易行难,虽然所有的企业都号称重视人才、珍惜人才,但能够真正做到的企业可谓凤毛麟 角,所以也只...
    10d017953849阅读 2,567评论 0 3
  • 《背诗》 作者:魏城 背诗 在路上背诗 在轮子上背诗 在浏览风景时背诗 在冷观世间风云时背诗 在热议天下大事时背诗...
    魏城阅读 265评论 0 0