是HTTP協議規定的一種機制:當client向server發送一個請求,要求獲取一個資源時,在server接收到這個請求后發現請求的這個資源實際存放在另一個位置,於是server在返回的response中寫入那個請求資源的正確的URL,並設置reponse的狀態碼為301(表示這是一個要求瀏覽器重定向的response),當client接受到這個response后就會根據新的URL重新發起請求。重定向有一個典型的特症,即,當一個請求被重定向以后,最終瀏覽器上顯示的URL往往不再是開始時請求的那個URL了。
在Servlet里,實現客戶端重定向的方法是:response.sendRedirect()。
Dispatch(Forward):轉發(又稱為服務器端重定向)
Dispatch(Forward)
指的是服務器在處理request的過程中將request先后委托多個servlet或jsp接替進行處理的過程。最為常見的是先由一個Servlet處理(比如實現業務邏輯的計算),然后forward給一個JSP進行視圖的渲染。在Servlet里,實現dispatch是通過RequestDispatchers來實現的,而這個類有兩個方法,一個是forward,另一個是include,相應的在JSP里實現dispatch的標簽也有兩個:<jsp:forward/>和<jsp:include/>.
不管是forward還是include,我們可以清楚的看到,從一個servlet或jsp向別一個servlet或jsp跳轉,request和reponse始終在期間傳遞,這是服務器端能實現dispatch模式的關鍵。換句話說,我們可以把request和reponse看作是一種資源,一系列的servlet和jsp都是在基於同一份資源完成它們職責范圍之內的計算。
兩者的區別是:
重定向是客戶端行為,轉發是服務器行為。
重定向過程:客戶瀏覽器發送http請求——》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——》服務器根據此請求尋找資源並發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。
轉發過程:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動作——》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
類別 | 概念 | 共享數據 | 應用 |
Redirect | URL重新定向:可以是任意的URL | 不能共享request里面的數據 | 一般用於用戶注銷登錄時返回主頁面和跳轉到其它的網站等等 |
Forward | 頁面的轉發:只能是同一個Web應用程序的其他Web組件 | 轉發頁面和轉發到的頁面可以共性request里面的數據 |
一般用於用戶登錄的時候根據角色轉發到相應的模塊等等
|