HTTP中的重定向和請求轉發的區別

一、調用方式

我們知道,在servlet中調用轉發、重定向的語句如下:request.getRequestDispatcher("new.jsp").forward(request, response);//轉發到new.jspresponse.sendRedirect("new.jsp");//重定向到new.jsp在jsp頁面中你也會看到通過下面的方式實現轉發:<jsp:forward page="apage.jsp" />當然也可以在jsp頁面中實現重定向:<%response.sendRedirect("new.jsp");//重定向到new.jsp%>

二、本質區別 解釋一  

一句話,轉發是伺服器行為,重定向是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程:

轉發過程:客戶瀏覽器發送http請求----》web伺服器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源發送給客戶;在這裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器發送http請求----》web伺服器接受後發送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》伺服器根據此請求尋找資源並發送給客戶。在這裡location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

解釋二

重定向,其實是兩次request, 第一次,客戶端request A,伺服器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的信息會被丟失。例子:

請求轉發是伺服器內部把對一個request/response的處理權,移交給另外一個 對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸的信息不會丟失。

例子:

解釋三

假設你去辦理某個執照, 重定向:你先去了A局,A局的人說:「這個事情不歸我們管,去B局」,然後,你就從A退了出來,自己乘車去了B局。 轉發:你先去了A局,A局看了以後,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到後面辦公室聯繫了B的人,讓他們辦好後,送了過來。

推薦閱讀:

為什麼fiddler無法抓到訊飛語音輸入的請求?
服務端處理耗時請求(發郵件/壓縮圖片/抓取網頁)一般有幾種方法?
最經典的前端面試題之一,你能答出什麼幺蛾子?
合併 HTTP 請求是否真的有意義?
共用的抽象模型(客戶及伺服器端)- (編集/反編集)過程

TAG:HTTP | 轉發 | 重定向 | 區別 |