1. 程式人生 > >Spring4.x官方參考文件中文版——第21章 Web MVC框架(19)

Spring4.x官方參考文件中文版——第21章 Web MVC框架(19)

21.6 使用flash attribute(flash屬性)

Flash屬性為一個請求提供了儲存屬性的方式,這些儲存的請求可以在另一個請求中使用。當重定向時,比如在Post/Redirect/Get模式下的時候,這種需求是很普遍的。flash屬性會在重定向之前暫存(一般是在session中),以便在重定向之後的請求中使用,並在使用後立即刪除。

       Spring MVC有2個主要的抽象類來支援flash屬性。FlashMap類是用來持有flash屬性的,而FlashMapManager類是用來儲存、檢索和管理FlashMap例項的。

       Flash屬性的支援總是設定為”on“(啟用狀態),所以不用去顯式地去啟用它,即便並不使用flash屬性時也一樣。它不會建立HTTP session。在每一個請求中,帶有一個”input(輸入)”的FlashMap物件,它帶有從前一個請求(如果存在的話)傳過來的attribute屬性,還有一個”output(輸出)“的FlashMap物件,它帶有為下一個請求儲存好的attribute屬性。這兩個FlashMap例項都能在Spring MVC的RequestContextUtils靜態方法,在任意位置訪問到。

       註解式的controller一般不需要直接與FlashMap進行協作。取而代之的是,@RequestMapping方法可以接受型別是RedirectAttributes的入參。在需要重定向的時候,可以使用它來新增flash屬性。通過RedirectAttributes新增的flash屬性會被自動地新增到”output(輸出)”FlashMap中。同樣地,在重定向之後,從”input(輸入)”FlashMap例項也會被自動地新增到為目標URL提供服務的controller中的Model物件中。

請求與flash屬性的匹配

       在許多的Web框架中,flash屬性這個概念是普遍存在的,並且已被證明在有些時候的併發情況下會暴露出一些問題。因為根據flash屬性的定義,這些屬性會被一直儲存到下一個請求為止。然而有可能下一個請求並不是這個請求的接收者,而是另一個非同步的請求(比如輪詢,或資源的請求),在這種情況下,flash屬性就會被過早地被移除。

        為了減少這種問題發生的可能性,RedirectView物件會自動地使用路徑和重定向目標URL的查詢引數來”stamp(標記)”FlashMap的例項。預設的FlashMapManager會在尋找”input” FlashMap時,也會反過來把這些資訊與傳入的請求進行匹配。

       這並不會完全消除併發問題發生的可能性,但仍大大減少了在重定向的URL已經生效的資訊中,發生該問題的可能性。因此,flash屬性主要在重定向場景中是推薦使用的。