1. 程式人生 > >面試必問題目:轉發與重定向的區別——最詳細的回答

面試必問題目:轉發與重定向的區別——最詳細的回答

在servlet中呼叫轉發:

request.getRequestDispatcher("new.jsp").forward(request,response);//轉發到new.jsp

在servlet中呼叫重定向:

response.sendRedirect("new.jsp");//重定向到new.jsp

轉發與重定向的區別:

1.轉發是伺服器行為;重定向是客戶端行為。轉發在伺服器端完成的;重定向是在客戶端完成的。

2.轉發的速度快;重定向速度慢。

3.轉發的是同一次請求;重定向是兩次不同請求。

4.轉發不會執行轉發後的程式碼;重定向會執行重定向之後的程式碼。

5.轉發位址列沒有變化;重定向位址列有變化。

6.轉發必須是在同一臺伺服器下完成;重定向可以在不同的伺服器下完成。

轉發過程:

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

重定向過程:

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

轉發,一次請求

請求轉發是指定伺服器中的某一個資源(Servlet或JSP)在處理請求的過程中,將請求轉發給一個其他的資源,讓其他資源來處理請求。請求只發送一次即可。

重定向,兩次請求

第一次,客戶端傳送request請求。A,伺服器響應,並response回來,告訴瀏覽器,你應該去B。這個時候,客戶端再發送request請求。B,伺服器響應,並response回來。表現為:可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。