在開發場景中,大部分資料都是使用請求**(forward)進行傳遞,而使用重定向(redirect)傳遞資料可能比較少。
那麼問題來了:請求中的資料生命週期存活時間只在乙個請求**(request)中,當這個請求結束後,那麼請求中所帶的資料也會隨著這個請求一起拜拜了。而重定向會向伺服器發起兩個請求,所以第乙個請求的資料不就到不了第二個請求了嗎?如圖:
如果我們想傳遞的資料在第二個請求中有效,那麼怎麼辦呢?有以下兩種方法可以解決:
url路徑傳遞url 路徑傳遞是比較簡單的一種選擇方式,因為重定向和請求**不同,所以在重定向時必須要前面加上使用flash屬性
redirect:
(不加的話預設就為請求**):下面為重定向到colablog
路徑下,傳遞
引數:如下:
// 如 "redirect:/colablog/johnson"
return "redirect:/colablog/"
還有一種方式是使用模板方式來定義重定向的url,如:
public string redirect(model model) ";
}若user.getusername()
為 johnson,那麼重定向的url將會變成redirect:/colablog/johnson
。
可以發現,使用url傳遞的都是一些比較簡單的資料,當我們需要傳遞物件時,可要怎麼辦呢?spring提供了資料傳送為flash功能,flash屬性會一直攜帶這些資料直到下一次請求,然後才會消失。提供實現的方法為redirectattributes
的addflashattribute
方法。如下:
public string test(redirectattributes attributes)
取出資料還是老樣子,像請求**(forward)那樣獲取資料。
public string colablog(model model)
redirectattributes
有model
類的所有方法,因為redirectattributes
是model
的擴充套件類。
public inte***ce redirectattributes extends model {}
至於為什麼使用flash屬性會攜帶到下一次請求中,然後才會消失呢?因為該flash屬性的資料會存放到會話當中,在重定向後,存在會話中的flash屬性會被取出,從會話資料轉移到模型資料之中。如下圖:![](https://pic.w3help.cc/4e5/52acea319ef52c9c4a239a34f8578.jpeg)
參考文獻:《spring實戰 第4版》
個人部落格**:
SpringMVC 跨重定向請求傳遞資料的方法實現
執行完post請求後,通常來講乙個最佳實踐就是執行重定向。重定向將丟棄原始請求資料,原始請求中的模型資料和請求都會消亡。可以有效避免使用者瀏覽器重新整理或者後退等操作,直接間接地重複執行已經完成的post請求。在控制方法中返回的檢視名稱中,在string前使用 redirect 字首,那麼這個str...
引數傳遞 重定向
設定v bind to 屬性,傳入引數id name 傳元件名 params 傳遞引數 需要物件 要用v bind 個人資訊 router link 在路由中繫結引數 index.js children 在profile.vue取出引數 template 所有元素 不能直接在根節點下 即 要用標籤包...
spring mvc 請求重定向
1 我在後台乙個controller跳轉到另乙個controller 方式一 使用modelandview return new modelandview redirect tolist 這樣可以重定向到tolist這個方法 方式二 返回string return redirect tolist 其...