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的控制器的模型中。
注:
匹配Flash属性的请求
Flash属性的概念存在于许多其他Web框架中,并且已经证明并发场景下有时会有问题。 这是因为根据定义,Flash属性将被存储直到下一个请求。 然而,“下一个”请求可能不是预期的接收者而是另一个异步请求(例如轮询或资源请求),在这种情况下,可能过早地移除Flash属性。
为了减少此类问题的可能性,RedirectView使用目标重定向URL的路径和查询参数自动“标记”FlashMap实例。 反过来,默认的FlashMapManager在查找“输入”FlashMap时会将该信息与传入请求进行匹配。
这并不能完全消除并发带来的问题,但仍然可以通过重定向URL中已有的信息大大减少它。 因此,建议主要针对重定向方案使用Flash属性。