一、重定向和轉發的區別
NO | 比較項目 | 重定向 | 轉發 |
---|---|---|---|
1 | 關鍵字 | redirect | forward |
2 | 地址欄URL | 會變 | 不會變 |
3 | 請求次數 | 至少2次請求 | 1次請求 |
4 | 跳轉速度 | 較慢 | 較快 |
5 | 哪一端行為 | 客戶端行為 | 服務端行為 |
6 | 信息傳遞 | 轉發2次信息不會丟失 | 重定向2次信息會丟失 |
7 | 跨程序訪問資源 | 可 | 不可 |
重定向和轉發的區別,幾乎是java web的入門知識。不管是剛畢業的學生或者經過培訓剛出來的新人,基本都能倒背如流。但是,針對上面的每一點,或者兩者的適用場合,如果要細究,恐怕少有人能說得很完整。
二、理解與分析
轉發圖示
重定向圖示
以上兩張圖示可以表示轉發和重定向的流程。以一個現實中的實例來說明兩者的區別:
轉發:張三去問李四一個java技術問題,李四一知半解,然后去問了王五,得知問題的答案后,李四再向張三解答該問題。這個過程中,張三只問了一次,也只得到了一次答復。
重定向:張三去問李四一個java技術問題,李四不會,然后告訴張三,"我不會,王五會,你去找他,他的地址是xxx"。然后張三去找王五,王五解答了該問題。這個過程中,張三問了兩次,得到了兩次答復(一次李四的答復,一次王五的答復)。
其實從不管從圖示,還是現實中的實例來看,基本能夠理解重定向和裝發的區別的含義了。例如:由於重定向訪問了兩次服務器以及得到兩次應答,轉發都只有一次。其性能必然會比轉發要低;重定向URL地址會變,轉發地址欄不會變等。
三、選擇與場景
重定向和轉發,不管是去理解它、去分析它或者要弄懂兩者之間的差別,都只是為了在合適的場景選擇合適的方式。
-
重定向。
我們先來說說重定向的優點。重定向可以防止重新加載頁面時執行了相同的動作(調用了相同的接口)。
例如,當提交表單的時候,執行保存的方法將會被調用,並執行相應的動作,數據入庫。但是如果在提交表單后,重新加載頁面,執行保存的方法就很有可能再次被調用。同樣的產品信息就將可能再次入庫,為了避免這種情況,提交表單后,你可以將用戶重定向到一個不同的頁面(例如列表頁面)。
再來談談重定向的缺點。重定向有一個不方便的地方,就是經過了客戶端,值容易丟失,不方便傳入目標頁面。不過在新版的spring(3.1)框架中,已經通過
RedirectAttributes
(該接口繼承了Model接口)接口解決了數值丟失的問題。使用方法與Modal
接口類似:attributes.addFlashAttribute("response",response);
然后在目標頁面接收該值。
另一方面,不同web程序之間的訪問,必須要用重定向。
-
轉發。
其實說完重定向的優點和缺點,我們大概就知道了什么時候有那個轉發的方式進行頁面跳轉了——除了以上必須用重定向的場景,其余的場景能有轉發就用轉發。而轉發可以用
Modal
(這個接口在spring2.5.1時就有了)這個接口很方便攜帶參數到目標頁面。
四、在SpringBoot中的使用
重定向和轉發在SpringBoot+thymeleaf中使用如下:
return "forward:/dashboard.html"; // 轉發
return "redirect:/main.html"; // 重定向
另外,區分通過thymeleaf模板引擎解析跳轉到響應的HTML頁面:
return "dashboard";
作者:追夢1819
來源:博客園
原文:https://www.cnblogs.com/yanfei1819/p/10540401.html
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!