請求轉發(Forward)和重定向(Redirect)的區別

原文鏈接:https://www.cnblogs.com/Qian123/p/5345527.html

forward(轉發)

是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因爲這個跳轉過程實在服務器實現的,並不是在客戶端實現的所以客戶端並不知道這個跳轉動作,所以它的地址欄還是原來的地址.

redirect(重定向)

是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.

轉發是服務器行爲,重定向是客戶端行爲。

區別

1. 從地址欄顯示來說
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,所以它的地址欄還是原來的地址.

redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.

2. 從數據共享來說
forward:轉發頁面和轉發到的頁面可以共享request裏面的數據.
redirect:不能共享數據.

3. 從運用地方來說
forward:一般用於用戶登陸的時候,根據角色轉發到相應的模塊.
redirect:一般用於用戶註銷登陸時返回主頁面和跳轉到其它的網站等

4. 從效率來說
forward:高.
redirect:低.

本質區別

  解釋一:

一句話,轉發是服務器行爲,重定向是客戶端行爲。爲什麼這樣說呢,這就要看兩個動作的工作流程:

轉發過程:客戶瀏覽器發送http請求----》web服務器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源發送給客戶;在這裏,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行爲是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器發送http請求----》web服務器接受後發送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》服務器根據此請求尋找資源併發送給客戶。在這裏 location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行爲是瀏覽器做了至少兩次的訪問請求的。

  解釋二:

重定向,其實是兩次request,
第一次,客戶端request A,服務器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的信息會被丟失。

例子:
請求轉發是服務器內部把對一個request/response的處理權,移交給另外一個
對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸的信息不會丟失。

  解釋三:

轉發是服務器行爲,重定向是客戶端行爲。 
 

兩者的內部機制有很大的區別:   
1 請求轉發只能將請求轉發給同一個WEB應用中的組件,
而重定向還可以重新定向到同一站點不同應用程序中的資源,甚至可以定向到一絕對的URL。   
2 重定向可以看見目標頁面的URL,
轉發只能看見第一次訪問的頁面URL,以後的工作都是有服務器來做的。  
3 請求響應調用者和被調用者之間共享相同的request對象和response對象,
重定向調用者和被調用者屬於兩個獨立訪問請求和響應過程。   
4 重定向跳轉後必須加上return,要不然頁面雖然跳轉了,
但是還會執行跳轉後面的語句,
轉發是執行了跳轉頁面,下面的代碼就不會在執行了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章