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 属性用于重定向场景。