JAVA中Forward和Redirect的區別
阿新 • • 發佈:2018-12-22
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
文中的例子和圖片摘自如下博主: