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 屬性。

© . This site is unofficial and not affiliated with VMware.