Flash 属性

闪存属性提供了一种方法,允许一个请求存储旨在在另一个请求中使用的属性。这在重定向时最常需要——例如,Post-Redirect-Get 模式。闪存属性在重定向之前临时保存(通常在会话中),以便在重定向后的请求中使用,并在之后立即删除。

Spring MVC 在支持闪存属性方面有两个主要的抽象。FlashMap 用于保存闪存属性,而FlashMapManager 用于存储、检索和管理FlashMap 实例。

闪存属性支持始终“开启”,无需显式启用。但是,如果未使用,则它永远不会导致 HTTP 会话创建。在每个请求中,都存在一个“输入”FlashMap,其中包含从先前请求(如果有)传递的属性,以及一个“输出”FlashMap,其中包含要保存到后续请求的属性。这两个FlashMap 实例都可以通过RequestContextUtils中的静态方法从 Spring MVC 中的任何地方访问。

带注解的控制器通常不需要直接使用FlashMap。相反,@RequestMapping 方法可以接受类型为RedirectAttributes 的参数,并使用它为重定向场景添加闪存属性。通过RedirectAttributes添加的闪存属性会自动传播到“输出”FlashMap。类似地,在重定向后,来自“输入”FlashMap的属性会自动添加到为目标 URL 提供服务的控制器的Model 中。

将请求与闪存属性匹配

闪存属性的概念存在于许多其他 Web 框架中,并且已被证明有时会暴露给并发问题。这是因为,根据定义,闪存属性要存储到下一个请求。但是,下一个请求可能不是预期的接收者,而是另一个异步请求(例如,轮询或资源请求),在这种情况下,闪存属性过早地删除了。

为了减少此类问题的可能性,RedirectView 会自动使用目标重定向 URL 的路径和查询参数“标记”FlashMap 实例。反过来,默认的FlashMapManager 在查找“输入”FlashMap时会将该信息与传入请求匹配。

这并不能完全消除并发问题的可能性,但通过重定向 URL 中已有的信息大大减少了并发问题的可能性。因此,我们建议您主要在重定向场景中使用闪存属性。