從SpringMvc瞭解轉發和重定向機制

1.爲什麼會思考轉發和重定向?

​ 平常我們在項目中對於用戶登錄模塊,用戶登錄成功後一般後臺是通過重定向來到一個新的頁面。那麼爲什麼這裏需要重定向?以及什麼時候使用轉發?這裏做一個記錄總結

1.1 爲什麼用戶登錄成功後需要進行重定向?

​ 重定向場景: 因爲重定向會修改瀏覽器地址, 所以 form 提交應該使用重定向, 以免用戶刷新頁面導致form重複提交.

1.2 轉發的場景

​ 場景:需要攜帶請求域request的相關參數 在後臺獲取使用的時候

2.轉發和重定向的定義

​ 一句話,轉發是服務器行爲,重定向是客戶端行爲。爲什麼這樣說呢,這就要看兩個動作的工作流程:

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

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


結合生活場景:

重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然後,你就從A退了出來,自己乘車去了B局。

轉發:你先去了A局,A局看了以後,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到後面辦公室聯繫了B的人,讓他們辦好後,送了過來。


原文鏈接:https://blog.csdn.net/meiyalei/java/article/details/2129120 感謝原作者精彩的案例分析。

3.兩者的區別?

區別 轉發 forword 重定向 redirect
地址欄 不發生變化 發生變化
跳轉 服務器跳轉1次 瀏覽器和服務器至少2此跳轉
請求域中數據(傳輸中的信息) 不會丟失 會丟失
訪問外部資源 不可以訪問自己web應用以外的資源 可以訪問自己web應用以外的資源

4.代碼實現調用

在servlet中調用轉發、重定向的語句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//轉發到new.jsp

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


在jsp頁面中你也會看到通過下面的方式實現轉發:
<jsp:forward page="apage.jsp" />

當然也可以在jsp頁面中實現重定向:
<%response.sendRedirect("new.jsp");//重定向到new.jsp%>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章