HTTP通信中的請求轉發和請求重定向

HTTP通信中的請求轉發和請求重定向

    在HTTP通信和Java Web開發中,經常會用到請求轉發和請求重定向,它們兩個有很大的區別:
    首先,請求轉發是指:一個Web資源在收到一個客戶端的請求後,去掉用另外一個資源進行處理,這個過程請稱爲請求轉發。很明顯,請求轉發是發生在Web服務器端的,客戶發發出Request,服務端在內部進行forward,然後把最終的結果Response給客戶端。
    請求重定向則是一個交互的過程,一個Client在請求服務器的過程中,服務器通知Client去訪問另一個資源稱爲請求重定向,服務器在Response頭中會加入Location字段,客戶端在收到這個Response後發現有Location字段,則就重新向Location指定的URL重新發送一次請求。
    在Servlet中,請求轉發的典型用法是:    
request.getRequestDispatcher(arg0).forward(request,response);
    從上面代碼可以看出,一個資源收到了一個request,然後調用它的getRequestDispatcher函數,來找到另一個資源,再通過forward方法把原始的request和response傳過去。對Client來講,它只發送了一次請求,得到了一次迴應。
    請求重定向的使用代碼如下:
response.sendRedirect(arg0);
    很明顯可以看出,重定向是發生在response中,sendRedirect方法就是在HTTP協議響頭中添加Location字段。

    關於請求轉發和請求重定向,還有如下細節區別:
    1. RequestDispatcher.forward方法只能將請求轉發到同一Web站點的其它組件,而HttpServletResponse.sendRedirect方法不僅可以將請求重定向到同一Web站點的其它資源,還可以僅用絕對的URL 地址重定向到別的站點。
    2. 瀏覽器發出請求後,HttpServletResponse.sendRedirect直接做出響應,響應的內容就是重定向到另一個URL,而RequestDispatcher.forward方法去將請求轉發給另一個資源,另一個資源處理後,再將處理的結果返回給瀏覽器。
    3. 請求重定向發生後,瀏覽器地址欄中的URL發生變化,由初始請求的URL變爲重定向後的URL。請求轉發的過程中,瀏覽器地址欄中的URL並未發生變化,瀏覽器不知道服務器器做了什麼事情。
    4. 對於RequestDispatcher.forward方法,調用者和被調用者共享同一個request對像和response對像,它們處理的是同一個請求和響應的過程。對於sendRedirect方法,調用者和被調用者使用的是各自的request對像和response對像,它們屬於兩個獨立的請求和響應過程。
    5. sendRedirect方法的相對URL以“/”開頭表示相對於整個WEB站點的根目錄,RequestDispatcher對像的相對URL以“/”開頭表示當前WEB應用的根目錄。

發佈了105 篇原創文章 · 獲贊 34 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章