Java 請求轉發和重定向的區別

一、請求轉發和重定向

1)請求轉發:

request.getRequestDispatcher(URL地址).forward(request, response)

處理流程:

  1. 客戶端發送請求,Servlet做出業務邏輯處理。
  2. Servlet調用forword()方法,服務器Servlet把目標資源返回給客戶端瀏覽器。

 

2)重定向:

response.sendRedirect(URL地址)

處理流程:

  1. 客戶端發送請求,Servlet做出業務邏輯處理。
  2. Servlet調用response.sendReadirect()方法,把要訪問的目標資源作爲response響應頭信息發給客戶端瀏覽器。
  3. 客戶端瀏覽器重新訪問服務器資源xxx.jsp,服務器再次對客戶端瀏覽器做出響應。

重定向

以上兩種情況,你都需要考慮Servlet處理完後,數據如何在jsp頁面上呈現。圖例是請求、響應的流程,沒有標明數據如何處理、展現。

二、轉發和重定向的路徑問題

1)使用相對路徑在重定向和轉發中沒有區別
2)重定向和請求轉發使用絕對路徑時,根/路徑代表了不同含義
重定向response.sendRedirect("xxx")是服務器向客戶端發送一個請求頭信息,由客戶端再請求一次服務器。/指的Tomcat的根目錄,寫絕對路徑應該寫成"/當前Web程序根名稱/資源名" 。如"/WebModule/login.jsp","/bbs/servlet/LoginServlet"
轉發是在服務器內部進行的,寫絕對路徑/開頭指的是當前的Web應用程序。絕對路徑寫法就是"/login.jsp"或"/servlet/LoginServlet"。

總結:以上要注意是區分是從服務器外的請求,還在是內部轉發,從服務器外的請求,從Tomcat根寫起(就是要包括當前Web的根);是服務器內部的轉發,很簡單了,因爲在當前服務器內,/寫起指的就是當前Web的根目錄。

三、轉發和重定向的區別

  1. request.getRequestDispatcher()是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;服務器內部轉發,整個過程處於同一個請求當中。
    response.sendRedirect()則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉後的鏈接地址。不在同一個請求。重定向,實際上客戶端會向服務器端發送兩個請求。
    所以轉發中數據的存取可以用request作用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的數據的。只能用session。

  2. forward()更加高效,在可以滿足需要時,儘量使用RequestDispatcher.forward()方法。(思考一下爲什麼?)

  3. RequestDispatcher是通過調用HttpServletRequest對象的getRequestDispatcher()方法得到的,是屬於請求對象的方法。
    sendRedirect()是HttpServletResponse對象的方法,即響應對象的方法,既然調用了響應對象的方法,那就表明整個請求過程已經結束了,服務器開始向客戶端返回執行的結果。

  4. 重定向可以跨域訪問,而轉發是在web服務器內部進行的,不能跨域訪問。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章