轉(zhuǎn)發(fā)和重定向的區(qū)別

2019-9-8    seo達(dá)人

簡單介紹

多個頁面和 servlet 組成了一個基于 Java 的 web 應(yīng)用程序。JSP 使用轉(zhuǎn)發(fā)和重定向兩種方式將控制權(quán)從一個 servlet 傳遞到另一個 servlet 或者 JSP。



轉(zhuǎn)發(fā)(Forward)方法: 將請求從一個 servlet 轉(zhuǎn)發(fā)到 web 應(yīng)用程序中的另一個資源,這個資源可以是一個 servlet、JSP 頁面、或者 HTML 文件。



重定向(Redirect)方法: 方法將請求重定向到另一個 web 應(yīng)用程序。使用轉(zhuǎn)發(fā)( Forward )方法無法完成此操作。如果一個重定向命中了同一個 web 應(yīng)用程序的不同資源,那么它使用的 URL 將與原始請求的 URL 不同。如果你不想響應(yīng)一個請求,你可以將請求重定向到一個不同的 URL,然后瀏覽器將會將你的新請求重定向到你提供的新的 URL。這篇文章詳細(xì)解釋了兩種方式的不同之處。



什么是轉(zhuǎn)發(fā)(Forward)

在基于 web 的系統(tǒng)或者應(yīng)用程序中,通常需要在不同的資源或 JSP 之間轉(zhuǎn)移控制權(quán)。例如:你如希望從電子商務(wù)網(wǎng)站下單,則需要先進(jìn)行注冊,然后才可以繼續(xù)。如果你還未在他們的系統(tǒng)中注冊,那么購物車界面可能會將控制權(quán)轉(zhuǎn)移到負(fù)責(zé)注冊過程的 JSP 表單。轉(zhuǎn)發(fā)( Forward )方法即是用于此目的。它用于將請求從一個 JSP 轉(zhuǎn)發(fā)到統(tǒng)一上下文中的另一個資源。



什么是重定向(Redirect)

此方法也用于轉(zhuǎn)發(fā) HTTP 請求,但與轉(zhuǎn)發(fā)( Forward )不同的是:它是一個兩步過程,其中重定向發(fā)生在客戶端到不同的應(yīng)用程序。Redirect 方法將用戶重定向到新的 URL。客戶端的瀏覽器會自動對來自服務(wù)器中的重定向表頭中指定的 URL 發(fā)出新的請求。它需要與客戶機(jī)進(jìn)行往返通訊,因此相對來說會比轉(zhuǎn)發(fā)( Forward )方法慢些。



轉(zhuǎn)發(fā)(Forward)與重定向(Redirect)區(qū)別

轉(zhuǎn)發(fā)(Forward)與重定向(Redirect)的描述

Forward() 方法用于將請求從一個 JSP 轉(zhuǎn)發(fā)到另一個 JSP,或從一個 JSP 轉(zhuǎn)發(fā)到另一個 servlet,或從一個 JSP 轉(zhuǎn)發(fā)到 web 應(yīng)用程序的另一個資源??刂剖窃谌萜鞯膬?nèi)部傳遞的,瀏覽器/客戶機(jī)不參與此過程。Forward( )方法在 RequestDispatcher 中聲明。



Sendredirect () 方法在 HttPServletResponse 中聲明,用于將客戶端請求重定向到不同服務(wù)器或上下文中可用的不同 URL。 通過重定向,您可以將瀏覽器重定向到完全不同的應(yīng)用程序。



客戶端是否參與轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)

這兩種方法之間的一個關(guān)鍵區(qū)別是 web 容器在 Forward() 情況中處理了所有的內(nèi)部進(jìn)程,而且 URL 在客戶端的瀏覽器中不會改變,因此客戶端/瀏覽器不會參與其中,從而使它們完全不知道動作已經(jīng)發(fā)生。



而在 Sendredirect () 的情況中,該方法設(shè)置適合的頭部信息和正文內(nèi)容以將請求重定向到不同的 URL 中,瀏覽器付負(fù)責(zé)將新的請求發(fā)送到客戶端可見的 URL。



執(zhí)行控制

當(dāng)在請求時執(zhí)行 Forward() 方法,當(dāng)前的請求會被轉(zhuǎn)發(fā)到另一個 JSP 頁面,對當(dāng)前 JSP 的處理也會被終止。請求可能會被轉(zhuǎn)發(fā)到另一個用 Java 編程語言編寫的 servlet,或者一個靜態(tài)的 HTML 頁面。



一個 SendRedirect() 請求只是簡單告知瀏覽器轉(zhuǎn)到另一個 URL,將執(zhí)行控制發(fā)送到 web 應(yīng)用程序之外。它使用一個兩步的過程來指示瀏覽器的 URL 發(fā)出另一個將控制轉(zhuǎn)發(fā)到另一個客戶端的請求。



速度

Forward () 在服務(wù)器內(nèi)運行,執(zhí)行速度比 SendRedirect () 快。



重定向必須通過瀏覽器,然后等待瀏覽器發(fā)出新的 HTTP 請求。 一個重定向使得服務(wù)器發(fā)送 HTTP 響應(yīng)狀態(tài)代碼 302 和一個包含新的 URL 的位置頭到瀏覽器,并且在瀏覽器收到狀態(tài)代碼 302 之后,它對位置頭中的 URL 發(fā)出一個新的請求。 這需要與客戶機(jī)進(jìn)行往返通信,這使得它比 Forward () 相對慢一些。



轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)比較圖表

轉(zhuǎn)發(fā)(Forward) 重定向(Redirect)

用于將請求從一個 JSP 轉(zhuǎn)發(fā)到另一個 JSP,或從一個 JSP 轉(zhuǎn)發(fā)到另一個 servlet,或從一個 JSP 轉(zhuǎn)發(fā)到 web 應(yīng)用程序的另一個資源。 用于將客戶端請求重定向到不同服務(wù)器或上下文中可用的不同 URL。

Forward( )方法在 RequestDispatcher 中聲明。 Sendredirect () 方法在 HttPServletResponse 中聲明

不涉及客戶端/瀏覽器,web 容器在內(nèi)部處理該過程。 當(dāng)客戶端將 URL 作為一個新的請求后,控制權(quán)將會轉(zhuǎn)移至客戶端或瀏覽器。

當(dāng)一個組件執(zhí)行業(yè)務(wù)邏輯并與另一個組件共享結(jié)果時,它最有效。 當(dāng)客戶端應(yīng)從一個頁面重定向到另一頁面時,此方法效果最佳。

它在服務(wù)器內(nèi)運行,并且比重定向執(zhí)行得更快。 它比轉(zhuǎn)發(fā)慢,因為它需要與客戶端進(jìn)行往返通信。

使用時,原來的 URL 請求不變。 原始的 URL 請求會改變。

兩種資源都必須屬于同一上下文。 將請求重定向到不屬于當(dāng)前上下文的其它 URL。

轉(zhuǎn)發(fā)(Forward)和重定向(Redirect)總結(jié)

學(xué)習(xí)轉(zhuǎn)發(fā)方法和重定向方法之間的區(qū)別是 Java 開發(fā)人員最重要的部分之一。 雖然控制器可以在處理請求結(jié)束時執(zhí)行轉(zhuǎn)發(fā)(Forward)或重定向(Redirect)方法,但它們有自己的一組用途。



大多數(shù)情況下,您會使用 Forward () 方法,因為它比 SendRedirect () 稍微快一點,而后者實際上需要與客戶機(jī)進(jìn)行往返通信,使其比 Forward() 更慢。 通過重定向,你可以將瀏覽器導(dǎo)向到另一個應(yīng)用程序。 這是轉(zhuǎn)發(fā)無法做到的。



簡而言之,當(dāng)一個組件必須執(zhí)行業(yè)務(wù)邏輯并與另一個組件共享結(jié)果時,轉(zhuǎn)發(fā)(Forward)工作效果最好,而當(dāng)客戶端應(yīng)該從一個頁面重定向到另一個頁面時,重定向(Redirect)工作效果最好。



以上內(nèi)容翻譯自:

Difference Between Forward and Redirect。

能力有限,還望斧正。

藍(lán)藍(lán)設(shè)計bouu.cn )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計  ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)。

日歷

鏈接

個人資料

存檔