轉發是服務器行爲,重定向是客戶端行爲。爲何這樣說呢,這就要看兩個動做的工做流程:web
轉發過程:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動做——》將目標資源發送給客戶;在這裏,轉發的路徑必須是同一個web容器下的url,其不能轉向到其餘的web路徑上去,中間傳遞的是本身的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感受不到服務器作了轉發的。轉發行爲是瀏覽器只作了一次訪問請求。瀏覽器
重定向過程:客戶瀏覽器發送http請求——》web服務器接受後發送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——》服務器根據此請求尋找資源併發送給客戶。在這裏location能夠重定向到任意URL,既然是瀏覽器從新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶能夠觀察到地址的變化的。重定向行爲是瀏覽器作了至少兩次的訪問請求的。服務器
轉發是瀏覽器上的網址不變併發
重定向,實際上是兩次requestjsp
第一次,客戶端request A,服務器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE能夠看到地址變了,並且歷史的回退按鈕也亮了。重定向能夠訪問本身web應用之外的資源。在重定向的過程當中,傳輸的信息會被丟失。url
例子:spa
response.sendRedirect("loginsuccess.jsp");資源
請求轉發是服務器內部把對一個request/response的處理權,移交給另一個get
對於客戶端而言,它只知道本身最先請求的那個A,而不知道中間的B,甚至C、D。傳輸的信息不會丟失。servlet
例子:
RequestDispatcherdis=request.getRequestDispatcher(「loginsuccess.jsp」);
Dis.forward(request,response);
重定向:
發送請求 -->服務器運行-->響應請求,返回給瀏覽器一個新的地址與響應碼-->瀏覽器根據響應碼,斷定該響應爲重定向,自動發送一個新的請求給服務器,請求地址爲以前返回的地址-->服務器運行-->響應請求給瀏覽器
轉發:
發送請求 -->服務器運行-->進行請求的從新設置,例如經過request.setAttribute(name,value)-->根據轉發的地址,獲取該地址的網頁-->響應請求給瀏覽器
先後兩個頁面 有數據傳遞 用請求轉發,沒有則用重定向。好比servlet查詢了數據須要在頁面顯示,就用請求轉發。好比servlet作了update操做跳轉到其餘頁面,就用重定向。