You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7:控制器间传递并修改ModelAndView的最优方案

最优实现方案

方案一:使用Flash Attributes(推荐)

Flash Attributes 是Spring MVC专门用于跨请求传递临时数据的机制,数据会暂存于Session中,在后续单次请求完成后自动清除,非常适配表单提交这类一次性跨请求传递场景。

  1. 修改第一个控制器,将需要保留的Model数据存入Flash属性:
@RequestMapping(value = "/controller-first", method = RequestMethod.GET)
public ModelAndView controllerFirst(Locale locale,
                                   HttpServletRequest request,
                                   HttpServletResponse response,
                                   Model model,
                                   RedirectAttributes redirectAttributes) {
    // 动态处理Model数据
    String dynamicData = "示例动态数据";
    model.addAttribute("pageData", dynamicData);
    
    // 将需要跨请求保留的数据存入Flash属性
    redirectAttributes.addFlashAttribute("persistedModelData", dynamicData);
    
    return new ModelAndView("static_resource_here");
}
  1. 第二个控制器获取Flash属性,修改后返回:
@RequestMapping(value = "/controller-second", method = RequestMethod.POST)
public ModelAndView controllerSecond(HttpServletRequest request,
                                   @ModelAttribute("persistedModelData") String persistedData,
                                   Model model) {
    // 修改从第一个控制器传递过来的数据
    String modifiedData = persistedData + " - 已修改";
    
    // 将修改后的数据放入Model,返回原视图或新视图
    model.addAttribute("pageData", modifiedData);
    return new ModelAndView("static_resource_here");
}

如果需要获取完整的Flash集合,也可以通过RequestContextUtils.getInputFlashMap(request)获取所有Flash属性。

方案二:使用SessionAttributes(适合多次请求共享场景)

如果需要在多个请求间持续共享数据,可以使用@SessionAttributes注解:

  1. 第一个控制器添加@SessionAttributes标注需要共享的属性名:
@Controller
@SessionAttributes("persistedModelData") // 指定需要存入Session的属性名
public class FirstController {
    @RequestMapping(value = "/controller-first", method = RequestMethod.GET)
    public ModelAndView controllerFirst(Locale locale,
                                       HttpServletRequest request,
                                       HttpServletResponse response,
                                       Model model) {
        // 动态处理Model数据
        String dynamicData = "示例动态数据";
        model.addAttribute("persistedModelData", dynamicData);
        model.addAttribute("pageData", dynamicData);
        
        return new ModelAndView("static_resource_here");
    }
}
  1. 第二个控制器通过@ModelAttribute获取Session中的属性,修改后返回,若无需再共享可清除:
@Controller
public class SecondController {
    @RequestMapping(value = "/controller-second", method = RequestMethod.POST)
    public ModelAndView controllerSecond(@ModelAttribute("persistedModelData") String persistedData,
                                       Model model,
                                       SessionStatus sessionStatus) {
        // 修改数据
        String modifiedData = persistedData + " - 已修改";
        model.addAttribute("pageData", modifiedData);
        
        // 如果后续不需要再共享该属性,调用setComplete()清除Session中的数据
        sessionStatus.setComplete();
        
        return new ModelAndView("static_resource_here");
    }
}

注意事项

  • 原代码中第一个控制器的方法名controller-first不符合Java语法规范,需改为controllerFirst这类合法名称。
  • Flash Attributes仅在后续的一次请求中有效,请求完成后自动销毁;@SessionAttributes的数据会保留到调用sessionStatus.setComplete()或Session过期。

内容的提问来源于stack exchange,提问作者Discipulos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:20:18