Flash 属性

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 属性匹配

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

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

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