一次重定向的過程
我的程式碼裡面已經寫好了,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跳轉,使用轉發會使一個好的選擇。