Spring之跨重定向請求傳遞數據
- 2019 年 12 月 15 日
- 筆記
摘要
在開發場景中,大部分數據都是使用請求轉發(forward)進行傳遞,而使用重定向(redirect)傳遞數據可能比較少。 那麼問題來了:請求中的數據生命周期存活時間只在一個請求轉發(request)中,當這個請求結束後,那麼請求中所帶的數據也會隨著這個請求一起拜拜了。而重定向會向伺服器發起兩個請求,所以第一個請求的數據不就到不了第二個請求了嗎?如圖:

如果我們想傳遞的數據在第二個請求中有效,那麼怎麼辦呢? 有以下兩種方法可以解決:
url路徑傳遞 使用flash屬性
url路徑傳遞
url 路徑傳遞是比較簡單的一種選擇方式,因為重定向和請求轉發不同,所以在重定向時必須要前面加上redirect:
(不加的話默認就為請求轉發): 下面為重定向到colablog
路徑下,傳遞{username}
參數:如下:
// 如 "redirect:/colablog/johnson" return "redirect:/colablog/{username}"
還有一種方式是使用模板方式來定義重定向的URL,如:
@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
。
使用flash屬性
可以發現,使用url傳遞的都是一些比較簡單的數據,當我們需要傳遞對象時,可要怎麼辦呢?Spring提供了數據發送為flash功能,flash屬性會一直攜帶這些數據直到下一次請求,然後才會消失。提供實現的方法為RedirectAttributes
的addFlashAttribute
方法。如下:
@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屬性會被取出,從會話數據轉移到模型數據之中。如下圖:

參考文獻:《Spring實戰 第4版》
作者:Johnson木木
鏈接:https://www.cnblogs.com/Johnson-lin/p/12038333.html