forward(轉發):web
是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,由於這個跳轉過程實在服務器實現的,並非在客戶端實現的因此客戶端並不知道這個跳轉動做,因此它的地址欄仍是原來的地址.瀏覽器
redirect(重定向):服務器
是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址.因此地址欄顯示的是新的URL.併發
轉發是服務器行爲,重定向是客戶端行爲。網站
區別:url
1. 從地址欄顯示來講
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因此它的地址欄仍是原來的地址.對象
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址.因此地址欄顯示的是新的URL.資源
2. 從數據共享來講
forward:轉發頁面和轉發到的頁面能夠共享request裏面的數據.
redirect:不能共享數據.web服務器
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,要否則頁面雖然跳轉了,可是還會執行跳轉後面的語句,轉發是執行了跳轉頁面,下面的代碼就不會在執行了。 |