我有一个控制器,它设置一些 Flash 属性并调用重定向。我还有一个前置控制器拦截器,它将拦截重定向的 URL 并强制进行另一个重定向。此时我的 Flash 属性被删除,因为 spring 认为重定向目标已经实现。
我想维护这些属性,以便我的第二个控制器可以在第二次重定向后访问它们。
有什么可能的方法来实现吗?
请注意,我无法更改最初填充它们的第一个控制器,我需要这些属性才能到达第二个重定向控制器。
我有一个控制器,它设置一些 Flash 属性并调用重定向。我还有一个前置控制器拦截器,它将拦截重定向的 URL 并强制进行另一个重定向。此时我的 Flash 属性被删除,因为 spring 认为重定向目标已经实现。
我想维护这些属性,以便我的第二个控制器可以在第二次重定向后访问它们。
有什么可能的方法来实现吗?
请注意,我无法更改最初填充它们的第一个控制器,我需要这些属性才能到达第二个重定向控制器。
在您的内部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);
我知道已经有一个公认的答案,但我想为@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 保存到输出中。