Spring MVC 使用閃存屬性

2018-07-26 14:14 更新

Flash屬性(flash attributes)提供了一個(gè)請(qǐng)求為另一個(gè)請(qǐng)求存儲(chǔ)有用屬性的方法。這在重定向的時(shí)候最常使用,比如常見(jiàn)的 POST/REDIRECT/GET 模式。Flash屬性會(huì)在重定向前被暫時(shí)地保存起來(lái)(通常是保存在session中),重定向后會(huì)重新被下一個(gè)請(qǐng)求取用并立即從原保存地移除。

為支持flash屬性,Spring MVC提供了兩個(gè)抽象。FlashMap被用來(lái)存儲(chǔ)flash屬性,而用FlashMapManager來(lái)存儲(chǔ)、取回、管理FlashMap的實(shí)例。

對(duì)flash屬性的支持默認(rèn)是啟用的,并不需要顯式聲明,不過(guò)沒(méi)用到它時(shí)它絕不會(huì)主動(dòng)地去創(chuàng)建HTTP會(huì)話(session)。對(duì)于每個(gè)請(qǐng)求,框架都會(huì)“傳進(jìn)”一個(gè)FlashMap,里面存儲(chǔ)了從上個(gè)請(qǐng)求(如果有)保存下來(lái)的屬性;同時(shí),每個(gè)請(qǐng)求也會(huì)“輸出”一個(gè)FlashMap,里面保存了要給下個(gè)請(qǐng)求使用的屬性。兩個(gè)FlashMap實(shí)例在Spring MVC應(yīng)用中的任何地點(diǎn)都可以通過(guò)RequestContextUtils工具類(lèi)的靜態(tài)方法取得。

控制器通常不需要直接接觸FlashMap。一般是通過(guò)@RequestMapping方法去接受一個(gè)RedirectAttributes類(lèi)型的參數(shù),然后直接地往其中添加flash屬性。通過(guò)RedirectAttributes對(duì)象添加進(jìn)去的flash屬性會(huì)自動(dòng)被填充到請(qǐng)求的“輸出”FlashMap對(duì)象中去。類(lèi)似地,重定向后“傳進(jìn)”的FlashMap屬性也會(huì)自動(dòng)被添加到服務(wù)重定向URL的控制器參數(shù)Model中去。

匹配請(qǐng)求所使用的flash屬性

flash屬性的概念在其他許多的Web框架中也存在,并且實(shí)踐證明有時(shí)可能會(huì)導(dǎo)致并發(fā)上的問(wèn)題。這是因?yàn)閺亩x上講,flash屬性保存的時(shí)間是到下個(gè)請(qǐng)求接收到之前。問(wèn)題在于,“下一個(gè)”請(qǐng)求不一定剛好就是你要重定向到的那個(gè)請(qǐng)求,它有可能是其他的異步請(qǐng)求(比如polling請(qǐng)求或者資源請(qǐng)求等)。這會(huì)導(dǎo)致flash屬性在到達(dá)真正的目標(biāo)請(qǐng)求前就被移除了。

為了減少這個(gè)問(wèn)題發(fā)生的可能性,重定向視圖RedirectView會(huì)自動(dòng)為一個(gè)FlashMap實(shí)例記錄其目標(biāo)重定向URL的路徑和查詢(xún)參數(shù)。然后,默認(rèn)的FlashMapManager會(huì)在為請(qǐng)求查找其該“傳進(jìn)”的FlashMap時(shí),匹配這些信息。

這并不能完全解決重定向的并發(fā)問(wèn)題,但極大程度地減少了這種可能性,因?yàn)樗梢詮闹囟ㄏ騏RL已有的信息中來(lái)做匹配。因此,一般只有在重定向的場(chǎng)景下,我們才推薦使用flash屬性。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)