W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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屬性。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: