請求轉發與URL重定向

yuanlb發表於2019-02-13

WEB元件之間有三種跳轉方式:請求轉發;URL重定向;請求包含。

請求轉發

從Servlet1,請求轉發到Servlet2。Servlet1完成一部分的功能,再跳轉到Sservlet2,繼續完成剩餘的功能。

request.getRequestDispatcher(String path).forward(request,response);

特點:

  • 瀏覽器位址列不會發生改變。
  • 請求轉發只傳送一個請求。
  • 轉發前和轉發後共享請求中的資料。
  • 最終相應給瀏覽器的由轉發後來決定。
  • 請求轉發不能跨域訪問,只能跳轉到當前應用中的資源。
  • 請求轉發可以訪問WEB-INF目錄中的資源。

URL重定向

response.sendRedirect(String url);

特點:

  • 瀏覽器地址會發生改變。
  • URL重定向是兩次不同的請求。
  • 因為URL重定向是兩次獨立的請求,所以不能共享請求中的資料。
  • 最終相應給瀏覽器的由定後來決定。
  • URL重定向能跨域訪問,可以訪問其他應用中的資源。
  • URL重定向不能訪問WEB-INF目錄中的資源。

請求包含

在一個頁面中可以包含其他頁面的內容。在Servlet中沒有意義,但是在JSP中有意義。 request.getRequestDispatcher(String path).inclode(request,response);

選擇方式:如果需要共享請求的資料,使用請求轉發;如果需要訪問WEB-INF中的資源使用請求轉發;如果需要跨域訪問,避免表單的重複提交使用URL重定向。


示例:

請求轉發是服務端行為:使用者傳送一個HTTP請求>>>伺服器接收到請求>>>呼叫內部方法在作用域(專案)中完成請求處理和轉發>>>將資源相應給客戶端。伺服器轉發的地址只能是域(專案)中的路徑,不能跳轉到其他域(專案)的路徑上,轉發後的URL位址列不變,只能通過瀏覽器開發者模式檢視到對應請求轉發的地址,客戶端只請求了一次服務端。

**重定向是客戶端行為:**使用者傳送一個HTTP請求>>>伺服器接收到傳送302狀態碼相應和重定向的地址>>>客戶端接受到狀態碼和定向的URL地址>>>客戶端重新傳送新的HTTP請求(請求的路徑是服務端相應給客戶端的URL路徑)>>>服務端接收到客戶端再次請求的資料並相應給客戶端資料。所以瀏覽器的URL位址列是會變化,而且在兩次請求中不能共享資料。

301,302都是HTTP狀態的編碼,都代表著URL發生了變化。301表示永久性跳轉,302表示暫時性跳轉。如果不是暫時性轉移推薦使用301永久性跳轉,301永久性跳轉對搜尋引擎優化更好。

相關文章