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屬性會一直攜帶這些數據直到下一次請求,然後才會消失。提供實現的方法為RedirectAttributesaddFlashAttribute方法。如下:

    @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";      }

RedirectAttributesModel類的所有方法,因為RedirectAttributesModel的擴展類。

public interface RedirectAttributes extends Model {}

至於為什麼使用flash屬性會攜帶到下一次請求中,然後才會消失呢?因為該flash屬性的數據會存放到會話當中,在重定向後,存在會話中的flash屬性會被取出,從會話數據轉移到模型數據之中。如下圖:

參考文獻:《Spring實戰 第4版》

作者:Johnson木木

鏈接:https://www.cnblogs.com/Johnson-lin/p/12038333.html