Flash 屬性

Flash 屬性提供了一種方式,允許一個請求儲存旨在用於另一個請求的屬性。這在重定向時最常用到——例如,Post-Redirect-Get 模式。Flash 屬性在重定向之前(通常在會話中)臨時儲存,以便在重定向後的請求中可用,並立即被移除。

Spring MVC 有兩個主要的抽象來支援 Flash 屬性。FlashMap 用於儲存 Flash 屬性,而 FlashMapManager 用於儲存、檢索和管理 FlashMap 例項。

Flash 屬性支援始終處於“開啟”狀態,無需顯式啟用。但是,如果不使用,它永遠不會導致建立 HTTP 會話。在每個請求中,都有一個包含前一個請求傳遞屬性(如果有)的“輸入” FlashMap,以及一個包含為後續請求儲存屬性的“輸出” FlashMap。這兩個 FlashMap 例項都可以透過 RequestContextUtils 中的靜態方法在 Spring MVC 的任何地方訪問。

帶註解的控制器通常不需要直接使用 FlashMap。相反,@RequestMapping 方法可以接受 RedirectAttributes 型別的引數,並使用它為重定向場景新增 Flash 屬性。透過 RedirectAttributes 新增的 Flash 屬性會自動傳播到“輸出” FlashMap。類似地,在重定向之後,來自“輸入” FlashMap 的屬性會自動新增到服務目標 URL 的控制器的 Model 中。

將請求與 Flash 屬性匹配

Flash 屬性的概念存在於許多其他 Web 框架中,並且事實證明有時會暴露於併發問題。這是因為,根據定義,Flash 屬性應該儲存到下一個請求。然而,所謂的“下一個”請求可能不是預期的接收者,而是另一個非同步請求(例如,輪詢或資源請求),在這種情況下,Flash 屬性會被過早地移除。

為了減少此類問題的可能性,RedirectView 會自動使用目標重定向 URL 的路徑和查詢引數“標記” FlashMap 例項。反過來,預設的 FlashMapManager 在查詢“輸入” FlashMap 時,會將該資訊與傳入請求進行匹配。

這並不能完全消除併發問題的可能性,但可以透過重定向 URL 中已有的資訊大大減少其可能性。因此,我們建議您主要在重定向場景中使用 Flash 屬性。