forward 和redirect的區別

2021-08-09 04:27:48 字數 4090 閱讀 8045

forward

和redirect

的區別

forward是伺服器請求資源,伺服器直接訪問目標位址的url,把那個url的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容是從哪兒來的,所以它的位址列中還是原來的位址。 

redirect就是服務端根據邏輯,傳送乙個狀態碼,告訴瀏覽器重新去請求那個位址,一般來說瀏覽器會用剛才請求的所有引數重新請求,所以session,request引數都可以獲取。

在servlet程式中,有時需要呼叫伺服器端的另外乙個資源來對瀏覽器的請求進行響應,這可以通兩種方式來實現;

其中一種就是呼叫 requestdispatcher.forward 方法與 include 方法實現的請求**;

另外一種則是呼叫 httpservletresponse.sendredirect 方法實現的請求重定向.

1: requestdispatcher 介面(請求**)   

requestdispatcher 介面中定義了兩個方法: 

forward 方法用於將請求**到 requestdispatcher 物件封裝的資源

include方法將 requestdispatcher 物件封裝的資源作為當前響應內容的一部分包含進來.

1) requestdispatcher物件的獲取[通過servletcontext物件]:      servletcontext 介面中定義了兩個用於獲取 requestdispatcher物件的方法      

(1) getrequestdispatcher(string param)      

(2) getnameddispatcher(string param)

servletcontext sc = this.getservletcontext();  //servletcontext物件的獲取

//requestdispatcher物件的獲取

requestdispatcher dis = sc.getrequestdispatcher("/servlet2");

requestdispatcher dis = sc.getrequestdispatcher("/servlets/targetservlet");

requestdispatcher dis = sc.getrequestdispatcher("/servlets/targetservlet?username=" + uname);

[注: 傳遞給該方法的路徑字串必須以"/"開頭,這個"/"代表當前web應用程式的根目錄] 

servletcontext sc = this.getservletcontext();  //servletcontext物件的獲取

[注: 傳遞給該方法的引數是在web應用程式部署描述符中宣告過的servlet或jsp的對映名稱] 

2) requestdispatcher物件的獲取[通過servletrequest物件]:      

在servletrequest介面中也定義了乙個 getrequestdispatcher(string param) 方法來獲取 requestdispatcher物件,它與servletcontext.getrequestdispatcher()方法的區別在於:  傳遞給這個方法的引數除了可以採用以"/"開頭的路徑字串,還可以採用非"/"開頭的相對路徑.      

(1) getrequestdispatcher(string param)

3) 用forward方法實現請求**      dis.forward(request, response); //[兩個頁面中的request與response是相同的,不過響應內容將被清空]   

4) 用include方法實現資源包含      dis.include(request, response); //[兩個頁面中的request與response是相同的]

2: httpservletresponse 介面(請求重定向)   httpservletresponse 介面中定義了一些用於將請求再次定向到新的資源下的方法,最主要的是   

(1) sendredirect(string url)   該方法不僅可以重定向到當前應用程式中的其他資源,它還可以重定向到同乙個站點上的其他   應用程式中的資源,甚至是使用絕對url重定向到其他站點的資源.而requestdispatcher.forward   方法只能在同乙個web應用程式內資源之間**請求.如果傳遞給sendredirect 方法的相對url不   是以"/"開頭,則表示是相對於當前請求的url;如果該相對url是以"/"開頭,則是相對於整個web站   點的根目錄,而不是相對於當前web應用程式的根目錄,例如,下面的語句表示重定向到當前站點中   的aptech應用程式根目錄下的index.html頁面;   response.sendredirect("/aptech/index.html");

1.從位址列顯示來說forward是伺服器請求資源,即伺服器直接訪問目標位址的url,把那個url的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道伺服器傳送的內容從**來的,所以它的位址列還是原來的位址.redirect是服務端根據邏輯,傳送乙個狀態碼,告訴瀏覽器重新去請求那個位址.所以位址列顯示的是新的url.

2.從資料共享來說forward:**頁面和**到的頁面可以共享request裡面的資料.redirect:不能共享資料.

3.從運用地方來說forward:一般用於使用者登陸的時候,根據角色**到相應的模組.redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的**等.

4.從效率來說forward:高.redirect:低.下面羅列三種網路上的具體解釋:

解釋一 一句話,**(forward)是伺服器行為,重定向(redirect)是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程:

**過程:客戶瀏覽器傳送http請求 --> web伺服器接受此請求 --> 呼叫內部的乙個方法在容器內部完成請求處理和**動作- --> 將目標資源傳送給客戶;在這裡,**的路徑必須是同乙個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了**的。**行為是瀏覽器只做了一次訪問請求。重定向過程:客戶瀏覽器傳送http請求----》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再傳送乙個新的http請求,請求url是新的location位址----》伺服器根據此請求尋找資源並傳送給客戶。在這裡location可以重定向到任意url,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到位址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

解釋二 重定向(redirect)其實是兩次request,第一次,客戶端request   a,伺服器響應,並response回來,告訴瀏覽器,你應該去b。這個時候ie可以看到位址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。請求**(forward)是伺服器內部把對乙個request/response的處理權,移交給另外乙個 對於客戶端而言,它只知道自己最早請求的那個a,而不知道中間的b,甚至c、d。 傳輸的資訊不會丟失。 

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

具體**實現中:在servlet中兩種實現: 

forward方式:request.getrequestdispatcher("/somepage.jsp").forward(request, response);

redirect方式:response.sendredirect("/somepage.jsp");

forward是伺服器內部重定向,程式收到請求後重新定向到另乙個程式,客戶機並不知道; 

redirect則是伺服器收到請求後傳送乙個狀態頭給客 戶,客戶將再請求一次,這裡多了兩次網路通訊的來往。當然forward也有缺點,就是forward的頁面的路徑如果是相對路徑就會有些問題了。

JAVA中Forward和Redirect的區別

forward和redirect代表了兩種請求 方式 直接 和間接 使用者向伺服器傳送了一次http請求,這個請求可能被直接請求 forward 和間接請求 redirect 兩種 方式有何區別呢?直接 就相當於 a找b借錢,b沒有,b去找c借,並告訴c把錢給a 間接 就相當於 a找b借錢,b沒有,...

jsp中的forward和redirect的區別

一 呼叫方式 我們知道,在servlet中呼叫 重定向的語句如下 request.getrequestdispatcher new.jsp forward request,response 到new.jsp response.sendredirect new.jsp 重定向到new.jsp 在jsp...

forward和sendredirect的區別

sendredirect forward 是不同的 request 雖然是不同的物件,但是,可以取到上乙個頁面的內容 send 後的語句會繼續執行,除非 return forward 後的語句不會繼續傳送給客戶端 速度慢 速度快 需要到客戶端的往返,可以轉到任何頁面,伺服器內部轉換,位址列有變化 位...