1. 程式人生 > >請求轉發(Forward)和重定向(Redirect)的區別

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

原文轉載自

forward(轉發):

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

redirect(重定向):

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

轉發是伺服器行為,重定向是客戶端行為。

區別:

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

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

  1. 從資料共享來說 forward:轉發頁面和轉發到的頁面可以共享request裡面的資料. redirect:不能共享資料.

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

  3. 從效率來說 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,要不然頁面雖然跳轉了, 但是還會執行跳轉後面的語句, 轉發是執行了跳轉頁面,下面的程式碼就不會在執行了。