重定向&轉發
轉發&重定向
重定向:向客戶端傳送一個指定URL的臨時重定向的響應。
轉發:將一個請求轉到伺服器的另一個資源。在處理完初步請求另外的資源之後生成響應。
定義基本說明轉發操作為何可以保持request內的parameter,attribute這些值都可以保留,而重定向操作卻會丟棄的原因:
- 轉發是在服務端完成的,並沒有經過客戶端
- 轉發整個操作完成後才生成響應
- 重定向是服務端向客戶端傳送指定的URL
- 重定向是在客戶端完成的
容器實現:
在servlet內部一般對於這兩者的使用形式也相當直觀,例如對於hello.jsp的請求:
sendRedirct方法:
response.sendRedirect("/hello.jsp");
是服務端根據邏輯,傳送一個狀態碼(302重定向),告訴瀏覽器重新去請求那個地址。位址列顯示的是新的URL。
forward方法:
request.getRequestDispatcher("/hello.jsp").forward(request, response);
在轉發中瀏覽器發請求的時候是一個固定的URL,整個重定向是服務端內部進行的,瀏覽器並沒有感知到,因此也不會顯示出來。
區別
-
位址列
-
forward:伺服器行為。
伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器不知道伺服器傳送的內容從哪裡來的,跳轉過程是在伺服器實現的,客戶端不知道這個跳轉動作,位址列不變
-
redirect:客戶端行為。
服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址,位址列顯示的是新的URL
-
-
資料共享
- forward:轉發頁面和轉發到的頁面可以共享request裡面的資料
- redirect:不能共享資料
-
使用場景
- forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組
- redirect:一般用於使用者登出登陸時,返回主頁面和跳轉到其它的網站等
-
效率
- forward:高
- redirect:低
-
重定向會顯示真實路徑,轉發不會;
-
重定向之後,原來的request中的資料都丟掉,而轉發卻還是能保證request中的資料依然保留;
兩個動作的工作流程:
轉發:
-
客戶瀏覽器傳送http請求
-
web伺服器接受此請求
-
呼叫內部的一個方法在容器內部完成請求處理和轉發動作
-
將目標資源傳送給客戶
在這裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。
轉發行為是瀏覽器只做了一次訪問請求
重定向:
- 客戶瀏覽器傳送http請求
- web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器
- 客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址
- 伺服器根據此請求尋找資源併發送給客戶
在這裡 location 可以重定向到任意URL,既然是瀏覽器重新發出請求,則就沒有什麼request傳遞的概念。在客戶瀏覽器路徑欄顯示的是其重定向的路徑, 客戶可以觀察到地址的變化的。
重定向行為是瀏覽器至少兩次的訪問請求的
重定向,其實是兩次request。第一次,客戶端request A,伺服器響應, 並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。