請求轉發(Forward)和重定向(Redirect)的區別

forward(轉發):

是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因爲這個跳轉過程實在服務器實現的,並不是在客戶端實現的所以客戶端並不知道這個跳轉動作,所以它的地址欄還是原來的地址.

redirect(重定向):

是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.

轉發是服務器行爲,重定向是客戶端行爲。

區別:

  1. 從地址欄顯示來說
    forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,所以它的地址欄還是原來的地址.

redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.

  1. 從數據共享來說
    forward:轉發頁面和轉發到的頁面可以共享request裏面的數據.
    redirect:不能共享數據.

  2. 從運用地方來說
    forward:一般用於用戶登陸的時候,根據角色轉發到相應的模塊.
    redirect:一般用於用戶註銷登陸時返回主頁面和跳轉到其它的網站等

  3. 從效率來說
    forward:高.
    redirect:低.

本質區別:

  解釋一:

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

轉發過程:客戶瀏覽器發送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。 傳輸的信息不會丟失。

  解釋三:

轉發是服務器行爲,重定向是客戶端行爲。

兩者的內部機制有很大的區別:
1 請求轉發只能將請求轉發給同一個WEB應用中的組件,
而重定向還可以重新定向到同一站點不同應用程序中的資源,甚至可以定向到一絕對的URL。
2 重定向可以看見目標頁面的URL,
轉發只能看見第一次訪問的頁面URL,以後的工作都是有服務器來做的。
3 請求響應調用者和被調用者之間共享相同的request對象和response對象,
重定向調用者和被調用者屬於兩個獨立訪問請求和響應過程。
4 重定向跳轉後必須加上return,要不然頁面雖然跳轉了,
但是還會執行跳轉後面的語句,
轉發是執行了跳轉頁面,下面的代碼就不會在執行了。
————-我是低調的分割線——

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

直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於每個信息資源是共享的。

間接轉發方式(Redirect)實際是兩次HTTP請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。

舉個通俗的例子:

  直接轉發就相當於:“A找B借錢,B說沒有,B去找C借,借到借不到都會把消息傳遞給A”;

  間接轉發就相當於:”A找B借錢,B說沒有,讓A去找C借”。

下面詳細闡述一下兩者的原理:

一:間接請求轉發(Redirect)
間接轉發方式,有時也叫重定向,它一般用於避免用戶的非正常訪問。例如:用戶在沒有登錄的情況下訪問後臺資源,Servlet可以將該HTTP請求重定向到登錄頁面,讓用戶登錄以後再訪問。在Servlet中,通過調用response對象的SendRedirect()方法,告訴瀏覽器重定向訪問指定的URL,示例代碼如下: 

1
2
3
4
5
6
7
……
//Servlet中處理get請求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//請求重定向到另外的資源
response.sendRedirect(“資源的URL”);
}
……..

上圖所示的間接轉發請求的過程如下:

瀏覽器向Servlet1發出訪問請求;
Servlet1調用sendRedirect()方法,將瀏覽器重定向到Servlet2;
瀏覽器向servlet2發出請求;
最終由Servlet2做出響應。
二:直接請求轉發(Forward)
直接轉發方式用的更多一些,一般說的請求轉發指的就是直接轉發方式。Web應用程序大多會有一個控制器。由控制器來控制請求應該轉發給那個信息資源。然後由這些信息資源處理請求,處理完以後還可能轉發給另外的信息資源來返回給用戶,這個過程就是經典的MVC模式。

javax.serlvet.RequestDispatcher接口是請求轉發器必須實現的接口,由Web容器爲Servlet提供實現該接口的對象,通過調用該接口的forward()方法到達請求轉發的目的,示例代碼如下:

1
2
3
4
5
6
7
8
9
……
//Servlet裏處理get請求的方法
public void doGet(HttpServletRequest request , HttpServletResponse response){
//獲取請求轉發器對象,該轉發器的指向通過getRequestDisPatcher()的參數設置
RequestDispatcher requestDispatcher =request.getRequestDispatcher(“資源的URL”);
//調用forward()方法,轉發請求
requestDispatcher.forward(request,response);
}
……

上圖所示的直接轉發請求的過程如下:

瀏覽器向Servlet1發出訪問請求;
Servlet1調用forward()方法,在服務器端將請求轉發給Servlet2;
最終由Servlet2做出響應。
技巧:其實,通過瀏覽器就可以觀察到服務器端使用了那種請求轉發方式,當單擊某一個超鏈接時,瀏覽器的地址欄會出現當前請求的地址,如果服務器端響應完成以後,發現地址欄的地址變了,則證明是間接的請求轉發。相反,如果地址沒有發生變化,則代表的是直接請求轉發或者沒有轉發。

問:直接轉發和間接轉發的原理及區別是什麼?

答:Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼裏,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。

對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request對象。

對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章