1. 程式人生 > >JAVA中Forward和Redirect的區別

JAVA中Forward和Redirect的區別

Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。

使用者向伺服器傳送了一次HTTP請求,這個請求可能被直接請求轉發(Forward)和間接請求轉發(Redirect),兩種轉發方式有何區別呢?

直接轉發就相當於:“A找B借錢,B沒有,B去找C借,並告訴C把錢給A”

間接轉發就相當於:"A找B借錢,B沒有,告訴A去找C借"

直接轉發方式(Forward)

客戶瀏覽器傳送http請求--->web伺服器接受此請求--->呼叫內部的一個方法在容器內部完成請求處理和轉發動作--->將目標資源 傳送給客戶

  • 轉發目標必須是同一個web容器下的url
  • 客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它資訊資源,由第二個資訊資源響應該請求,由於在整個定向的過程中用的是同一個request,因此forward會將request的資訊帶到被重定向的jsp或者servlet中使用。即儲存的物件對於每個資訊資源是共享的
  • 在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑
  • 轉發行為是瀏覽器只做了一次訪問請求。 
  • 一般用於使用者登入的時候,根據角色轉發到相應的模組
request.getRequestDispatcher("login.jsp").forward(request, response);   
//轉發到login.jsp

間接轉發方式(Redirect)

客戶瀏覽器傳送http請求--->web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器--->客戶瀏覽器發現 是302響應,則自動再發送一個新的http請求,請求url是新的location地址--->伺服器根據此請求尋找資源併發送給客戶

  • 是客戶端的重定向,是完全的跳轉。即伺服器返回的一個url給客戶端瀏覽器,然後客戶端瀏覽器會重新發送一次請求,到新的url裡面,因此瀏覽器中顯示的url網址會發生變化
  • 因為這種方式比forward多了一次網路請求,因此效率會低於forward
  • 在重定向的過程中,傳輸的資訊會被丟失。
  • 一般用於使用者登出登入時返回主頁面或者跳轉到其他網站
response.sendRedirect("login.jsp");   
//重定向到login.jsp

文中的例子和圖片摘自如下博主: