【问题标题】:Maintaining Spring flash attribute after redirect is fulfilled重定向完成后维护 Spring flash 属性
【发布时间】:2023-03-27 09:11:01
【问题描述】:

我有一个控制器,它设置一些 Flash 属性并调用重定向。我还有一个前置控制器拦截器,它将拦截重定向的 URL 并强制进行另一个重定向。此时我的 Flash 属性被删除,因为 spring 认为重定向目标已经实现。

我想保留这些属性,以便我的第二个控制器可以在第二次重定向后访问它们。

有什么方法可以实现吗?

请注意,我无法更改最初填充它们的第一个控制器,我需要这些属性才能到达第二个重定向控制器。

【问题讨论】:

  • 将它们添加到新注入的RedirectAttributes 对象中或自己将它们放入HttpSession 中。
  • 让我澄清一下:控制器 A 填充 RedirectAttributes 对象并重定向到控制器 B。控制器 B 永远无法到达,因为拦截器将强制重定向到控制器 C。在我的拦截器中,我可以访问请求、响应和处理程序方法。我只能将代码添加到控制器 C 或拦截器。你建议我在哪里检索它们?

标签: spring spring-mvc


【解决方案1】:

在您的HandlerInterceptor 中,您应该执行以下操作

FlashMap lastAttributes = RequestContextUtils.getInputFlashMap(request); // should hold the attributes from your last request       
FlashMap forNextRequest = RequestContextUtils.getOutputFlashMap(request); // will hold the attributes for your next request
forNextRequest.putAll(lastAttributes);

【讨论】:

    【解决方案2】:

    我知道已经有一个公认的答案,但我想为@Sotirios Delimanolis 的答案添加一些细节。

    我做的是:

    Map<String, ?> previousFlashAttributes = RequestContextUtils.getInputFlashMap(request);
    FlashMap flashAttributesForNextRequest = RequestContextUtils.getOutputFlashMap(request);
    if (previousFlashAttributes != null && flashAttributesForNextRequest != null) {
        flashAttributesForNextRequest.putAll(previousFlashAttributes);
        RequestContextUtils.getFlashMapManager(request).saveOutputFlashMap(flashAttributesForNextRequest, request, response);
    }
    

    最后一行将 FlashMap 保存到输出中。

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 2012-07-30
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2018-05-19
      • 1970-01-01
      相关资源
      最近更新 更多