forward和redirect的區(qū)別是什么 Forward和Redirect原理
大家都知道Forward和Redirect都是處理客戶(hù)端請(qǐng)求并負(fù)責(zé)轉(zhuǎn)發(fā)的,那么他們的原理與區(qū)別又是什么呢?
原理示意圖:
如上圖所示為直接轉(zhuǎn)發(fā)(Forward)和間接轉(zhuǎn)發(fā)(Redirect)的工作原理示意圖。很明顯,當(dāng)用戶(hù)發(fā)出請(qǐng)求的時(shí)候,對(duì)于Forward(直接轉(zhuǎn)發(fā))是服務(wù)器直接請(qǐng)求資源,把內(nèi)容響應(yīng)給用戶(hù),這個(gè)過(guò)程只有一次請(qǐng)求,即只有一個(gè)request對(duì)象。而對(duì)于Redirect(間接轉(zhuǎn)發(fā)),是服務(wù)器反饋給瀏覽器讓它重新再發(fā)起一次請(qǐng)求,這個(gè)過(guò)程中有兩次請(qǐng)求,即有兩個(gè)request對(duì)象。我們可以說(shuō)Forward是一種服務(wù)器行為,而Redirect是一種客戶(hù)端行為。
那么他們有什么區(qū)別呢?
源代碼方法不同:Forward對(duì)應(yīng)的是RequestDispatcher類(lèi)的forward()方法,而Redirect對(duì)應(yīng)的是HttpServletRequest類(lèi)的sendRedirect()方法。
瀏覽器的地址欄顯示不同:當(dāng)用戶(hù)發(fā)起請(qǐng)求服務(wù)器響應(yīng)回來(lái)之后,F(xiàn)orward的地址欄的URL是不變的,而Redirect的地址欄會(huì)發(fā)生改變。
數(shù)據(jù)共享不同:對(duì)于Forward,轉(zhuǎn)發(fā)到的頁(yè)面是可以共享request里面的數(shù)據(jù),因?yàn)檎{(diào)用者和被調(diào)用者之間共享相同的request對(duì)象和response對(duì)象;而Redirect則不可以,因?yàn)檎{(diào)用者和被調(diào)用者屬于兩個(gè)獨(dú)立的請(qǐng)求-響應(yīng)過(guò)程。
內(nèi)部機(jī)制不同:Forward只能將請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)Web應(yīng)用中的組件,而Redirect可以重新定向到同一站點(diǎn)不同應(yīng)用程序中的資源,甚至可以定向到一絕對(duì)的URL。
處理效率不同:Forward的效率比Redirect高。
還有大家在書(shū)寫(xiě)代碼的時(shí)候,要記住Redirect跳轉(zhuǎn)后必須加上return,不然頁(yè)面雖然跳轉(zhuǎn)了,但是還會(huì)執(zhí)行跳轉(zhuǎn)后面的語(yǔ)句,forward是執(zhí)行了跳轉(zhuǎn)頁(yè)面,下面的代碼是不會(huì)在執(zhí)行的。