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

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

簡(jiǎn)單介紹

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



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



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



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

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



什么是重定向(Redirect)

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



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

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

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



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



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

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



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



執(zhí)行控制

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



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



速度

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



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



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

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

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

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

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

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

它在服務(wù)器內(nèi)運(yùn)行,并且比重定向執(zhí)行得更快。 它比轉(zhuǎn)發(fā)慢,因?yàn)樗枰c客戶端進(jìn)行往返通信。

使用時(shí),原來(lái)的 URL 請(qǐng)求不變。 原始的 URL 請(qǐng)求會(huì)改變。

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

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

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



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



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



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

Difference Between Forward and Redirect。

能力有限,還望斧正。

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

分享本文至:

日歷

鏈接

個(gè)人資料

存檔