請(qǐng)求轉(zhuǎn)發(fā)和重定向

1、 定義

  • Forward(請(qǐng)求轉(zhuǎn)向):服務(wù)器程序內(nèi)部請(qǐng)求轉(zhuǎn)向,這個(gè)特性允許前一個(gè)程序用于處理請(qǐng)求,而后一個(gè)程序用來(lái)返回響應(yīng)。
  • Redirect(重定向):服務(wù)端發(fā)送給客戶端一個(gè)重定向的臨時(shí)響應(yīng)頭,這個(gè)響應(yīng)頭包含重定向之后的URL,客戶端用新的URL重新向服務(wù)器發(fā)送一個(gè)新的請(qǐng)求。

2、定義簡(jiǎn)單理解

  • 請(qǐng)求轉(zhuǎn)發(fā)只是把請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器上(通常是同一個(gè)Web應(yīng)用中)的另一個(gè)組件(Servlet或Jsp等)。
  • 重定向則只是告訴客戶(瀏覽器)去訪問(wèn)另一個(gè)URL(可能是同一個(gè)Web站點(diǎn)甚至其他站點(diǎn))。

3、本質(zhì)區(qū)別

  • 請(qǐng)求轉(zhuǎn)發(fā)發(fā)生在服務(wù)器端,由服務(wù)器(比如servlet)控制。
  • 重定向發(fā)生在客戶端,由客戶(通常是瀏覽器)控制。

4、請(qǐng)求和響應(yīng)次數(shù)

  • 請(qǐng)求轉(zhuǎn)發(fā)過(guò)程在同一個(gè)請(qǐng)求當(dāng)中完成,只會(huì)返回一個(gè)響應(yīng)。
  • 重定向過(guò)程則發(fā)生在兩個(gè)不同的請(qǐng)求中,會(huì)返回兩個(gè)不同響應(yīng)。

5、基于第4點(diǎn),進(jìn)一步分析

  • 請(qǐng)求轉(zhuǎn)發(fā)后可以在服務(wù)器端獲取本次請(qǐng)求對(duì)象上保存的信息(比如在Servlet中將用戶名保存到當(dāng)前request對(duì)象中,轉(zhuǎn)發(fā)給另一組件(如JSP)后,另一組件可以通過(guò)request對(duì)象取得用戶名信息)。
  • 請(qǐng)求轉(zhuǎn)發(fā)后,瀏覽器地址欄URL不會(huì)發(fā)生改變。
  • 重定向后則無(wú)法在服務(wù)器端獲取第一次請(qǐng)求對(duì)象上保存的信息(比如還是在Servlet中將用戶名保存到當(dāng)前request對(duì)象中,并重定向到一個(gè)新的URL,然后在新URL指向的地址中(比如還是某個(gè)Servlet)就無(wú)法獲取原先保存在第一個(gè)請(qǐng)求中的信息。很明顯,用戶名是保存在第一次請(qǐng)求的對(duì)象中,但并沒(méi)有保存在本次(第二次)請(qǐng)求的對(duì)象中)。
  • 重定向后,瀏覽器地址欄URL變?yōu)樾碌腢RL(因?yàn)闉g覽器確實(shí)給新的URL發(fā)送了一個(gè)新的請(qǐng)求)。

6、服務(wù)器端調(diào)用的方法

7、基于第6點(diǎn),進(jìn)一步分析

  • RequestDispatcher對(duì)象是通過(guò)調(diào)用HttpServletRequest對(duì)象的getRequestDispatcher()方法得到的,所以forward()或include()本質(zhì)來(lái)說(shuō)是屬于請(qǐng)求對(duì)象的方法,所以請(qǐng)求轉(zhuǎn)發(fā)始終發(fā)生在一個(gè)請(qǐng)求當(dāng)中。
  • sendRedirect()方法HttpServletResponse對(duì)象的方法,即響應(yīng)對(duì)象的方法。既然調(diào)用了響應(yīng)對(duì)象的方法,就表示本次請(qǐng)求過(guò)程已經(jīng)結(jié)束了,服務(wù)器即將向客戶端返回本次請(qǐng)求的響應(yīng)了。事實(shí)上,服務(wù)器確實(shí)返回了一個(gè)狀態(tài)碼為“302”,首部“Location”值為新的URL的響應(yīng)。然后瀏覽器就會(huì)根據(jù)“Location”首部指定的URL,重新發(fā)起一次新的請(qǐng)求,轉(zhuǎn)向這個(gè)目標(biāo)頁(yè)面,所以重定向?qū)嶋H上發(fā)生在兩個(gè)不同的請(qǐng)求當(dāng)中。

8、sendRedirect()和forword()中使用相對(duì)URL分析(站點(diǎn)為:http://localhost:8080/,Web應(yīng)用為MyApp)。

  • sendRedirect(URL):如果使用”/”開頭,則表示相對(duì)于整個(gè)Web站點(diǎn)的根目錄,如使用sendRedirect(“/foo/myHtml.html”)時(shí),容器建立的完整URL為:http://localhost:8080/foo/myHtml.html。否則,就表示相對(duì)于當(dāng)前目錄。
  • request.getRequestDispatcher(URL).forward(req,res):如果使用”/”開頭,則表示相對(duì)于當(dāng)前Web應(yīng)用的根目錄,而非整個(gè)Web站點(diǎn)的根目錄,如使用request.getRequestDispatcher(/foo/myHtml.html).forward(req,res)時(shí),容器會(huì)建立絕對(duì)(完整)的URL為:http://localhost:8080/MyApp/foo/myHtml.html。否則,同樣表示相對(duì)于當(dāng)前目錄。

9、跳轉(zhuǎn)時(shí)機(jī)(有待考究)

  • 請(qǐng)求轉(zhuǎn)發(fā)執(zhí)行到跳轉(zhuǎn)語(yǔ)句后馬上無(wú)條件跳轉(zhuǎn),之后的代碼不再執(zhí)行。
  • 重定向則會(huì)在所有代碼執(zhí)行完畢后跳轉(zhuǎn),但不能再向response中寫入任何數(shù)據(jù)。(可以在重定向跳轉(zhuǎn)后加上return語(yǔ)句,實(shí)現(xiàn)馬上跳轉(zhuǎn))

10、執(zhí)行時(shí)機(jī)(相同點(diǎn))

  • 請(qǐng)求轉(zhuǎn)發(fā)和重定向方法都必須在響應(yīng)提交(刷新響應(yīng)正文輸出到流中)之前執(zhí)行,否則會(huì)拋出IllegalStateException異常。
  • 在轉(zhuǎn)發(fā)或重定向之前,響應(yīng)緩沖區(qū)中未提交的數(shù)據(jù)會(huì)被自動(dòng)清除。

11、響應(yīng)速度(理論上)

  • 請(qǐng)求轉(zhuǎn)發(fā)相對(duì)快:因?yàn)檎?qǐng)求轉(zhuǎn)發(fā)過(guò)程在同一請(qǐng)求中。
  • 重定向相對(duì)慢:因?yàn)橹囟ㄏ蜻^(guò)程發(fā)生在兩個(gè)不同的請(qǐng)求中。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、請(qǐng)求轉(zhuǎn)發(fā)和重定向 請(qǐng)求轉(zhuǎn)發(fā):request.getRequestDispatcher(URL地址).forwa...
    向右奔跑閱讀 15,136評(píng)論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • API定義規(guī)范 本規(guī)范設(shè)計(jì)基于如下使用場(chǎng)景: 請(qǐng)求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請(qǐng)求頻率非常高,建議使用雙通...
    有涯逐無(wú)涯閱讀 2,607評(píng)論 0 6
  • ?得人者得天下,所謂知易行難,雖然所有的企業(yè)都號(hào)稱重視人才、珍惜人才,但能夠真正做到的企業(yè)可謂鳳毛麟 角,所以也只...
    10d017953849閱讀 2,619評(píng)論 0 3
  • 《背詩(shī)》 作者:魏城 背詩(shī) 在路上背詩(shī) 在輪子上背詩(shī) 在瀏覽風(fēng)景時(shí)背詩(shī) 在冷觀世間風(fēng)云時(shí)背詩(shī) 在熱議天下大事時(shí)背詩(shī)...
    魏城閱讀 281評(píng)論 0 0