1. 程式人生 > >Forward和Redirect的區別?

Forward和Redirect的區別?

【考點】

  • Forward轉發請求的原理;
  • Redirect轉發請求的原理。

【分析】

  ForwardRedirect代表了兩種請求轉發方式:直接轉發和間接轉發。

直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它資訊資源,由第二個資訊資源響應該請求,在請求物件request中,儲存的物件對於每個資訊資源是共享的。

 

間接轉發方式(Redirect)實際是兩次HTTP請求,伺服器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。

間接請求轉發(Redirect)

  間接轉發方式,有時也叫重定向,它一般用於避免使用者的非正常訪問。例如:使用者在沒有登入的情況下訪問後臺資源,

  Servlet可以將該HTTP請求重定向到登入頁面,讓使用者登入以後再訪問。在Servlet中,通過呼叫response物件的SendRedirect()方法,

  告訴瀏覽器重定向訪問指定的URL,示例程式碼如下:

1 ......
2 //Servlet中處理get請求的方法
3 public void doGet(HttpServletRequest request,HttpServletResponse response){
4 //請求重定向到另外的資源
5 response.sendRedirect("資源的URL"); 6 } 7 ........

 

  圖解:

    

  1. 瀏覽器向Servlet1發出訪問請求;
  2. Servlet1呼叫sendRedirect()方法,將瀏覽器重定向到Servlet2;
  3. 瀏覽器向servlet2發出請求;
  4. 最終由Servlet2做出響應。
  5. 總結:請求物件已經改變了,不再是同一個請求物件。

 

直接請求轉發(Forward)

一般說的請求轉發指的就是直接轉發方式。Web應用程式大多會有一個控制器。由控制器來控制請求應該轉發給哪個資訊資源。

然後由這些資訊資源處理請求,處理完以後還可能轉發給另外的資訊資源來返回給使用者,這個過程就是我們常說的MVC模式。

 

javax.serlvet.RequestDispatcher介面是請求轉發器必須實現的介面,由Web容器為Servlet提供實現該介面的物件,

通過呼叫該介面的forward()方法到達請求轉發的目的,示例程式碼如下:

 

1 ......
2     //Servlet裡處理get請求的方法
3  public void doGet(HttpServletRequest request , HttpServletResponse response){
4      //獲取請求轉發器物件,該轉發器的指向通過getRequestDisPatcher()的引數設定
5    RequestDispatcher requestDispatcher =request.getRequestDispatcher("資源的URL");
6     //呼叫forward()方法,轉發請求      
7    requestDispatcher.forward(request,response);    
8 }
9 ......

   圖解:

    

  1. 瀏覽器向Servlet1發出訪問請求;
  2. Servlet1呼叫forward()方法,在伺服器端將請求轉發給Servlet2;
  3. 最終由Servlet2做出響應。
  4. 總結:其實,通過瀏覽器就可以觀察到伺服器端使用了那種請求轉發方式,當單擊某一個超連結時,瀏覽器的位址列會出現當前請求的地址,
  5. 如果伺服器端響應完成以後,發現位址列的地址變了,則證明是間接的請求轉發。相反,如果地址沒有發生變化,則代表的是直接請求轉發或者沒有轉發。

 

  直接轉發和間接轉發的原理及區別是什麼?

 

  Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。

 

  分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。

  對於間接方式,伺服器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request物件。

 

  對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它資訊資源,由第2個資訊資源響應該請求,兩個資訊資源共享同一個request物件。