1. 程式人生 > >Http中的重定向和轉發

Http中的重定向和轉發

    在專案開發中,經常會用到轉發和重定向,它們雖然都是轉向,但是二者卻有著本質的區別。而且,該開始接觸的時候,也不清楚到底什麼時候用轉發,什麼時候用重定向。那到底它們有什麼區別呢?又該怎麼用呢?下面就一起看看吧。

表面區別

轉發

    轉發是用RequestDispatcher的forward進行的,一般情況下程式碼是這樣寫的:

request.getRequestDispatcher("/basedata/item_modify.jsp").forward(request, response);

    在getRequestDispatcher中傳入轉發的地址,然後將Request和Response兩個物件傳過去,這樣Request物件中所攜帶的資料也就被一起帶到所轉向的地址,在這個地址中就可以通過request.getAttribute方法來獲取傳遞過來的資料。例如下面的程式碼,是從一個Servlet中轉發到一個jsp頁面中。

    在一個Servlet中的程式碼:

request.setAttribute("itemUnitList", itemUnitList);
//轉發
request.getRequestDispatcher("/basedata/item_modify.jsp").forward(request, response);

在item_modify.jsp中就可以這樣接收:
List itemUnitList = (List)request.getAttribute("itemUnitList");

重定向

    重定向是用response.sendRedirect方法來實現的,程式碼如下:

response.sendRedirect(request.getContextPath() + "/servlet/item/SearchItemServlet");

    在sendRedirect的引數中,加入重定向的路徑,就可以重定向到該路徑中去。但是在重定向的過程中,request物件是沒有被攜帶過去的,所以重定向後,request中的資料是無法在重定向的路徑中接收的。

本質區別

1、轉發是發生在伺服器端的,重定向是發生在瀏覽器端的。

    轉發是不同頁面或Servlet要做同一個請求處理,也就是說瀏覽器向伺服器傳送了一個請求,伺服器的一個Servlet並不能完全處理這個請求,只處理了一部分,然後會讓另一個Servlet接著處理另外一部分,這時候就需要轉發給另一個Servlet,並將資料通過Request物件傳遞過去。第二個Servlet處理完成後,就直接返回給瀏覽器處理結果了。它是伺服器為了處理瀏覽器的請求進行的操作,瀏覽器並不知道伺服器進行了轉發,所以這個過程中,瀏覽器的URL是不變的。

    而重定向就不同了,重定向是瀏覽器給伺服器傳送了一個請求,伺服器對瀏覽器的請求給出了一個響應,告訴瀏覽器應該訪問下一個地址了。這個時候,瀏覽器是應該自己再去訪問另外一個URL,這時候就可以看到位址列的URL是改變了的。重定向時,瀏覽器至少向伺服器傳遞了兩個請求。

2、轉發的速度較快,重定向的速度較慢

    轉發的請求是在容器的內部進行處理的,只能講請求轉發給同一個Web應用中的元件是一次請求完成的,所以響應速度較快。

    而重定向不僅可以重定向到當前應用程式中的其他資源,還可以重定向到同一個站點上的其他應用程式中的資源,甚至重定向到其他站點的資源。而且重定向至少要兩次向伺服器請求,所以響應速度較慢。

3、轉發的地址是相對於當前Web應用程式的根目錄,重定向的地址是相對於整個Web站點的根目錄

    從上面的程式碼可以看出,在轉發時,可以直接用

"/servlet/item/SearchItemServlet"

它會直接在該應用程式根目錄下找該路徑。

    而重定向的路徑需要這樣寫,

request.getContextPath() + "/servlet/item/SearchItemServlet"

這樣才是找該應用程式下的路徑。如果不寫前面的

request.getContextPath()

則要從整個Web站點根目錄下開始找,如果沒有該路徑,程式就該拋異常了。

用法

    二者的區別搞清楚了,那麼什麼時候用轉發,什麼時候用重定向呢?

    當不同servlet或頁面之間共享相同的request和response物件時,表明它們屬於同一個請求過程,這時候就要用轉發。

    當不同servlet或頁面之間使用各自的request和response物件,則表明它們是不同的請求過程,這時候就要用重定向。另外,如果一個Web應用程式需要呼叫另一個Web應用程式的資源時,就需要用到重定向。

總結

    看過的《高效能人士的七個習慣》這本書中,有一個小例子很相似。作者去外地講課時住在一家賓館,講課時他忘了帶筆,於是向服務員請求幫忙,服務員說“先生您稍等,我馬上解決這個問題!”,這就是轉發,作者並不知道他是怎麼做的,但是確實解決了這個問題。如果服務員跟作者說“您可以去問一下前臺”,這樣就是把一個URL返回給了作者,讓他去另外一個地址尋求幫助,也就是重定向。明顯的重定向要比轉發的效率低。這個故事雖然是在講企業文化的,但是放在這裡同樣適用,可謂生活中處處是程式設計。