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