原作者:萌小Q
原博客鏈接:請(qǐng)求轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)的區(qū)別
forward(轉(zhuǎn)發(fā)):
是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,因?yàn)檫@個(gè)跳轉(zhuǎn)過程實(shí)在服務(wù)器實(shí)現(xiàn)的,并不是在客戶端實(shí)現(xiàn)的所以客戶端并不知道這個(gè)跳轉(zhuǎn)動(dòng)作,所以它的地址欄還是原來的地址.
redirect(重定向):
是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.
轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。
區(qū)別:
- 從地址欄顯示來說
forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.
從數(shù)據(jù)共享來說
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).從運(yùn)用地方來說
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.
redirect:一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等
- 從效率來說
forward:高.
redirect:低.
本質(zhì)區(qū)別:
解釋一:
一句話,轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個(gè)動(dòng)作的工作流程:
轉(zhuǎn)發(fā)過程:客戶瀏覽器發(fā)送http請(qǐng)求----> web服務(wù)器接受此請(qǐng)求----> 調(diào)用內(nèi)部的一個(gè)方法在容器內(nèi)部完成請(qǐng)求處理和轉(zhuǎn)發(fā)動(dòng)作----> 將目標(biāo)資源發(fā)送給客戶;在這里,轉(zhuǎn)發(fā)的路徑必須是同一個(gè)web容器下的url,其不能轉(zhuǎn)向到其他的web路徑上去,中間傳遞的是自己的容器內(nèi)的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務(wù)器做了轉(zhuǎn)發(fā)的。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問請(qǐng)求。
重定向過程:客戶瀏覽器發(fā)送http請(qǐng)求----> web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對(duì)應(yīng)新的location給客戶瀏覽器--> 客戶瀏覽器發(fā)現(xiàn)是302響應(yīng),則自動(dòng)再發(fā)送一個(gè)新的http請(qǐng)求,請(qǐng)求url是新的location地址----> 服務(wù)器根據(jù)此請(qǐng)求尋找資源并發(fā)送給客戶。在這里 location可以重定向到任意URL,既然是瀏覽器重新發(fā)出了請(qǐng)求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請(qǐng)求的。
解釋二:
重定向,其實(shí)是兩次request,
第一次,客戶端request A,服務(wù)器響應(yīng),并response回來,告訴瀏覽器,你應(yīng)該去B。這個(gè)時(shí)候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應(yīng)用以外的資源。在重定向的過程中,傳輸?shù)男畔?huì)被丟失。
例子:
請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部把對(duì)一個(gè)request/response的處理權(quán),移交給另外一個(gè)
對(duì)于客戶端而言,它只知道自己最早請(qǐng)求的那個(gè)A,而不知道中間的B,甚至C、D。 傳輸?shù)男畔⒉粫?huì)丟失。
解釋三:
轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。
兩者的內(nèi)部機(jī)制有很大的區(qū)別:
請(qǐng)求轉(zhuǎn)發(fā)只能將請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)WEB應(yīng)用中的組件,
而重定向還可以重新定向到同一站點(diǎn)不同應(yīng)用程序中的資源,甚至可以定向到一絕對(duì)的URL。重定向可以看見目標(biāo)頁面的URL,
轉(zhuǎn)發(fā)只能看見第一次訪問的頁面URL,以后的工作都是有服務(wù)器來做的。請(qǐng)求轉(zhuǎn)發(fā)調(diào)用者和被調(diào)用者之間共享相同的request對(duì)象和response對(duì)象,
重定向調(diào)用者和被調(diào)用者屬于兩個(gè)獨(dú)立訪問請(qǐng)求和響應(yīng)過程。重定向跳轉(zhuǎn)后必須加上return,要不然頁面雖然跳轉(zhuǎn)了,
但是還會(huì)執(zhí)行跳轉(zhuǎn)后面的語句,
轉(zhuǎn)發(fā)是執(zhí)行了跳轉(zhuǎn)頁面,下面的代碼就不會(huì)在執(zhí)行了。