跳到主要内容

Flash 属性

ChatGPT-4o-mini 中英对照 Flash Attributes

Flash 属性提供了一种方法,使一个请求能够存储用于另一个请求的属性。这在重定向时最常见 — 例如,Post-Redirect-Get 模式。Flash 属性在重定向之前暂时保存(通常在会话中),以便在重定向后可用于请求,并会立即被移除。

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

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

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

匹配请求与闪存属性

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

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

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