Spring之跨重定向請求傳遞數據

摘要

在開發場景中,大部分數據都是使用請求轉發(forward)進行傳遞,而使用重定向(redirect)傳遞數據可能比較少。
那麼問題來了:請求中的數據生命週期存活時間只在一個請求轉發(request)中,當這個請求結束後,那麼請求中所帶的數據也會隨着這個請求一塊兒拜拜了。而重定向會向服務器發起兩個請求,因此第一個請求的數據不就到不了第二個請求了嗎?如圖:服務器

若是咱們想傳遞的數據在第二個請求中有效,那麼怎麼辦呢?有如下兩種方法能夠解決:微信

url路徑傳遞app

使用flash屬性url

---spa

url路徑傳遞

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對象

使用flash屬性

能夠發現,使用url傳遞的都是一些比較簡單的數據,當咱們須要傳遞對象時,可要怎麼辦呢?Spring提供了數據發送爲flash功能,flash屬性會一直攜帶這些數據直到下一次請求,而後纔會消失。提供實現的方法爲RedirectAttributesaddFlashAttribute方法。以下: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";
    }複製代碼

RedirectAttributesModel類的全部方法,由於RedirectAttributesModel的擴展類。

public interface RedirectAttributes extends Model {}複製代碼

至於爲何使用flash屬性會攜帶到下一次請求中,而後纔會消失呢?由於該flash屬性的數據會存放到會話當中,在重定向後,存在會話中的flash屬性會被取出,從會話數據轉移到模型數據之中。以下圖:

好了,文章到這裏就結束了,不知道各位小夥伴看懂了沒。若還有問題可在下方留言,Thanks♪(・ω・)ノ

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

我的博客網址: https://colablog.cn/

若是個人文章幫助到您,能夠關注個人微信公衆號,第一時間分享文章給您

微信公衆號

相關文章
相關標籤/搜索