Java Web forward和redirect的區別
客戶端向服務器發送一次HTTP請求,該請求可能會經過多個信息資源處理以後才把結果返回給客戶端,各個信息資源使用請求轉發機制相互轉發請求。根據轉發方式的不同,可以區分為直接請求轉發(Forward)和間接請求轉發(Redirect)。
直接請求轉發(Forward)
直接轉發方式用的更多,一般說的請求轉發指的就是直接轉發方式。javax.serlvet.RequestDispatcher接口是請求轉發器必須實現的接口,由Web容器為Servlet提供實現該接口的對象,通過調用該接口的forward方法達到請求轉發的目的,示例代碼如下:
1 // Servlet裏處理get請求的方法
2 public void doGet(HTTPServletRequest request, HTTPServletResponse response){
3 // 獲取請求轉發器對象,該轉發器的指向通過getRequestDisPatcher()的參數設置
4 RequestDispatcher requestDispatcher = request.getRequestDispatcher("資源的URL");
5 // 調用forward()方法,轉發請求
6 requestDispatcher.forward(request,response);
7 }
圖1 轉發示意圖
轉發過程:客戶瀏覽器發送HTTP請求->Web服務器接受此請求->調用內部的一個方法在容器內部完成請求處理和轉發動作->將目標資源發送給客戶。轉發的路徑是同一個Web容器下的URL,不能轉向到其他的Web容器路徑上,中間傳遞的是自己容器內的request對象。在客戶端瀏覽器路徑欄顯示的仍然是第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。對於轉發,瀏覽器只發送了一次HTTP請求。
間接請求轉發(Redirect)
間接轉發方式也稱為重定向,用於防止用戶的非正常訪問。例如,用戶在沒有登錄的情況下訪問後臺資源,Servlet可以通過該HTTP請求重定向到登錄頁面,讓用戶登錄以後再訪問。在Servlet中,通過調用HTTPServletRequest類的response對象的sendRedirect方法,告訴客戶端重定向到指定的URL,示例代碼如下:
1 // Servlet中處理get請求的方法
2 public void doGet(HTTPServletRequest request,HTTPServletResponse response){
3 // 請求重定向到另外的資源
4 response.sendRedirect("資源的URL");
5 }
圖2 重定向示意圖
重定向過程:客戶端發送HTTP請求->服務器接收後發送302狀態碼響應以及對應新的location給客戶端->客戶端發現是302響應,自動發送一個新的HTTP請求,請求URL是新的location->服務器根據此請求尋找資源並發送給客戶端。location可以重定向到任意URL,因為客戶端重新發送了請求,所以沒有傳遞request對象。在瀏覽器路徑欄顯示的是重定向的 路徑,用戶可以觀察到地址的變化。對於重定向,客戶端發送了2次請求,對應兩個request對象。
轉發是服務器行為,重定向是客戶端行為。從數據共享來說,轉發頁面和轉發到的頁面可以共享同一個request和response對象裏面的數據,需要防止表單重復提交,重定向則不能。從用途來說,轉發用於用戶登錄後根據角色轉發到相應的模塊,重定向用於用戶退出後跳轉到登錄頁面。從效率上來說,轉發更高,因為它只發送一次請求。
生活中的例子
假設某個人去辦理執照,
轉發:先去了A局,A局看了以後,知道這個事情由B局管,讓你坐一會兒,自己到後面辦公室聯系了B的人,讓他們辦好後,送了過來;重定向:先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然後,從A退了出來,自己乘車去了B局。
參考資料
JAVA常見面試題之Forward和Redirect的區別
forward和redirect的區別
《Java程序員面試筆試寶典》 P172
Java Web forward和redirect的區別