1. 程式人生 > 其它 >重定向&轉發

重定向&轉發

轉發&重定向

重定向:向客戶端傳送一個指定URL的臨時重定向的響應。

轉發:將一個請求轉到伺服器的另一個資源。在處理完初步請求另外的資源之後生成響應。

定義基本說明轉發操作為何可以保持request內的parameter,attribute這些值都可以保留,而重定向操作卻會丟棄的原因:

  • 轉發是在服務端完成的,並沒有經過客戶端
  • 轉發整個操作完成後才生成響應
  • 重定向是服務端向客戶端傳送指定的URL
  • 重定向是在客戶端完成的

容器實現:
在servlet內部一般對於這兩者的使用形式也相當直觀,例如對於hello.jsp的請求:

sendRedirct方法:

response.sendRedirect("/hello.jsp");

是服務端根據邏輯,傳送一個狀態碼(302重定向),告訴瀏覽器重新去請求那個地址。位址列顯示的是新的URL。

forward方法:

request.getRequestDispatcher("/hello.jsp").forward(request, response);

在轉發中瀏覽器發請求的時候是一個固定的URL,整個重定向是服務端內部進行的,瀏覽器並沒有感知到,因此也不會顯示出來。

區別

  1. 位址列

    1. forward:伺服器行為。

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

    2. redirect:客戶端行為。

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

  2. 資料共享

    1. forward:轉發頁面和轉發到的頁面可以共享request裡面的資料
    2. redirect:不能共享資料
  3. 使用場景

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

    1. forward:高
    2. redirect:低
  5. 重定向會顯示真實路徑,轉發不會;

  6. 重定向之後,原來的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應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。