轉發(forward)和重定向(redirect)的區別


轉發與重定向是入門JavaWeb的一個知識點,也是許多面試JAVA的后台所會遇到的一道面試題,許多的視頻教程對於轉發與重定向的理解並不透徹。

在這里跟我一起探究轉發與重定向的魅力吧。

 

用戶向服務器發送Http請求,作為用戶沒辦法直觀感受到請求轉發的存在,但是我們的數據都是經過請求轉發之后才能到達用戶端的。

 

我們腦子里先記住一個概念:轉發(forward)=直接請求轉發(forward)、重定向(redirect)=間接請求轉發(redirect)

 

然后我舉一個我看到最直觀地例子帶着大家入門一下:

直接轉發相當於:“A找B借錢,B說沒有,B去找C借,借到借不到都會把消息跟A說”

間接轉發相當於:“A找B借錢,B說沒有,讓A去找C借”,但是A不會跟B說A借到了。

 

上面的例子通俗易懂可以理解了吧

接下來用專業的術語

直接轉發方式:

         客戶端和瀏覽器只發出一次請求,Servlet,HTML,JSP或其他的信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於每個信息資源是共享的。

         直接轉發方式用的更多一些,是用控制器來控制請求應該轉發給哪個信息資源,然后由這些信息資源處理請求,處理完以后還以為轉發給另外的信息資源來返回給用戶,這個過程就是典型的MVC模式。

代碼:

    //Servlet里處理get請求的方法

 public void doGet(HttpServletRequest request , HttpServletResponse response){

     //獲取請求轉發器對象,該轉發器的指向通過getRequestDisPatcher()的參數設置

   RequestDispatcher requestDispatcher =request.getRequestDispatcher("資源的URL");

    //調用forward()方法,轉發請求     

   requestDispatcher.forward(request,response);   

}

 

 

 

間接請求轉發(重定向):

         實際上是兩次的HTTP請求,服務器在響應第一次請求的時候,讓瀏覽器再想另外一個URL發出請求,從而達到轉發的目的。一般用來避免用戶的非正常訪問。

代碼:

......

//Servlet中處理get請求的方法

public void doGet(HttpServletRequest request,HttpServletResponse response){

//請求重定向到另外的資源

    response.sendRedirect("資源的URL");

}

........

 

 

總結一句話:轉發是服務器行為,重定向是客戶端行為。

轉發過程:客戶瀏覽器發送http請求--àweb服務器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器發送http請求--àweb服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》服務器根據此請求尋找資源並發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM