Flash 屬性

Flash 屬性提供一種方式,讓一個請求儲存預期在另一個請求中使用的屬性。這在重導時最為常見 — 例如,Post-Redirect-Get 模式。Flash 屬性在重導之前暫時儲存(通常在 session 中),以便在重導後的請求中使用,並立即移除。

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

Flash 屬性支援始終處於「開啟」狀態,無需明確啟用。但是,如果不使用,則永遠不會導致 HTTP session 建立。在每個請求中,都有一個「輸入」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 屬性用於重導情境。