重定向和請求轉發的區別

五月的倉頡發表於2015-10-29

一次重定向的過程

我的程式碼裡面已經寫好了,redirectAndFoward.jsp頁面上有一個表單,表單重定向到redirectAndFowardTarget.jsp,那麼這一次的重定向過程為:

1、以指定方式(表單看method,直接URL發起就是GET)發一次請求到後臺,後臺處理重定向,返回一個302的HTTP狀態碼給客戶端,並在response裡面帶一個Location用於標識重定向的地址

2、以Location的地址為目標地址,客戶端再發起一次請求

 

一次請求轉發的過程

以指定方式(表單看method,直接URL發起就是GET)發一次請求到後臺,後臺直接跳轉到將要重定向的地址,如果成功則返回狀態碼200給客戶端:

 

重定向和請求轉發的區別

1、從上面的一次重定向和一次轉發的過程來看,我們可以得出第一個差別點,就是重定向是兩次請求,轉發是一次請求,因此轉發的速度要快於重定向

2、第二個差別點也很明顯,重定向之後位址列上的地址會發生變化,變化成第二次請求的地址,轉發之後位址列上的地址不會變化,還是第一次請求的地址

網上關於重定向和請求轉發的區別的文章有很多,裡面的區別點也有很多,但是總結起來無非就是這兩點,再多的區別點也都是這兩點的擴充,所以,重定向和請求轉發的區別理解了這兩點的差別就可以了。另外還有一點,不是重定向和請求轉發之間的區別,但是值得注意,那就是重定向和請求轉發之後的程式碼都會執行,直到方法結束或者遇到了return語句

 

重定向和請求轉發URL引數的解讀

我們知道在Java Web中,一個Servlet分別是這麼寫重定向和轉發的程式碼的:

1、response.sendRedirect("XXX");

2、request.getRequestDispatcher("XXX").forward(request, response);

這個括號裡面的引數也是有一定的規則的,我自己的總結如下:

1、重定向的時候,如果引數為"http://xxxxxxxxxx",那麼重定向到的是指定的重定向地址,無論該重定向地址是內部的還是外部的

2、如果引數不是"http://xxxxxxxxxx"的樣子,而是一般的寫法,那麼都是Tomcat內部跳轉(注意是Tomcat內部跳轉而不是專案內部跳轉),重定向和請求轉發的時候有些區別:

(1)重定向,如果XXX以"/"開頭,則表示目標地址為http://ip:port/XXX;如果不以"/"開頭,則表示目標地值為http://ip:port/專案名/XXX

(2)請求轉發,無論XXX是否以"/"開頭,都跳轉到http://ip:port/專案名/XXX

 

重定向和請求轉發選擇的個人建議

頁面跳轉建議使用重定向,有內部Servlet跳轉建議使用轉發。

選擇重定向作為頁面跳轉的理由

1、轉發請求地址不會變化,這就導致了開發者並不知道實際轉發的目標頁面是哪個,對於開發者來說這真的是一件糟糕的事,不知道轉發的目標頁面會在出錯的時候給定位問題帶來很大的麻煩

2、假如開發者在Servlet中做了耗時間的查詢資料庫操作,然後放到session裡面去,讓目標頁面拿session顯示給使用者。此時如果使用轉發,那麼在重新整理這個頁面的時候,該Servlet會被再請求一遍,也就是說把查詢資料庫->設定session這個步驟再做一遍,而實際上這是毫無意義的。重定向則不會有問題,由於重定向之後的是一個.jsp頁面,重新整理頁面無非是讓頁面重新載入一次罷了。

3、轉發只能在站內跳轉,重定向可以跳轉到任意想要的地址----只要這個地址存在,所以請求頁面的時候轉發相比重定向也有侷限性

因此,雖然轉發的速度比重定向快,但是從規避問題的角度而言,頁面跳轉使用重定向絕對是比轉發更好的選擇。

選擇轉發作為內部Servlet跳轉的理由

如果程式碼邏輯是ServletA->ServletB->*.jsp,使用轉發,那麼這三次操作都在一次請求中,而如果使用重定向,那麼客戶端將發起三次請求,這真的毫無必要。因此,如果程式碼邏輯中含有內部的Servlet跳轉,使用轉發會使一個好的選擇。

相關文章