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()方法。(思考一下為什麼?)(使用forward()可以實現傳值,例如在登陸註冊時,設定好的使用者名稱由servlet傳遞給jsp時,如果用重定向,jsp就不能獲取該使用者的資訊,但是利用forward()時,就可以傳送該使用者的資訊)

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

  4. 重定向可以跨域訪問,而轉發是在web伺服器內部進行的,不能跨域訪問。