在開發場景中,大部分數據都是使用請求轉發(forward)進行傳遞,而使用重定向(redirect)傳遞數據可能比較少。
那麼問題來了:請求中的數據生命週期存活時間只在一個請求轉發(request)中,當這個請求結束後,那麼請求中所帶的數據也會隨着這個請求一塊兒拜拜了。而重定向會向服務器發起兩個請求,因此第一個請求的數據不就到不了第二個請求了嗎?如圖:服務器
若是咱們想傳遞的數據在第二個請求中有效,那麼怎麼辦呢?有如下兩種方法能夠解決:微信
url路徑傳遞app
使用flash屬性url
---spa
url 路徑傳遞是比較簡單的一種選擇方式,由於重定向和請求轉發不一樣,因此在重定向時必需要前面加上redirect:
(不加的話默認就爲請求轉發):下面爲重定向到colablog
路徑下,傳遞{username}
參數:以下:code
// 如 "redirect:/colablog/johnson"
return "redirect:/colablog/{username}" 複製代碼
還有一種方式是使用模板方式來定義重定向的URL,如:cdn
@GetMapping("/red")
public String redirect(Model model) {
User user = ...;
model.addAttribute("username", user.getUsername());
return "redirect:/colablog/{username}";
}複製代碼
若 user.getUsername()
爲 johnson,那麼重定向的url將會變成redirect:/colablog/johnson
。對象
能夠發現,使用url傳遞的都是一些比較簡單的數據,當咱們須要傳遞對象時,可要怎麼辦呢?Spring提供了數據發送爲flash功能,flash屬性會一直攜帶這些數據直到下一次請求,而後纔會消失。提供實現的方法爲RedirectAttributes
的addFlashAttribute
方法。以下:blog
@GetMapping("/test")
public String test(RedirectAttributes attributes){
User user = ...;
attributes.addFlashAttribute("user", user);
return "redirect:/colablog";
}複製代碼
取出數據仍是老樣子,像請求轉發(forward)那樣獲取數據。生命週期
@GetMapping("/colablog")
public String colaBlog(Model model) {
User user = model.getAttribute("user");
return "success";
}複製代碼
RedirectAttributes
有Model
類的全部方法,由於RedirectAttributes
是Model
的擴展類。
public interface RedirectAttributes extends Model {}複製代碼
至於爲何使用flash屬性會攜帶到下一次請求中,而後纔會消失呢?由於該flash屬性的數據會存放到會話當中,在重定向後,存在會話中的flash屬性會被取出,從會話數據轉移到模型數據之中。以下圖:
好了,文章到這裏就結束了,不知道各位小夥伴看懂了沒。若還有問題可在下方留言,Thanks♪(・ω・)ノ
參考文獻:《Spring實戰 第4版》
我的博客網址: https://colablog.cn/
若是個人文章幫助到您,能夠關注個人微信公衆號,第一時間分享文章給您