Spring Boot 2.7:控制器间传递并修改ModelAndView的最优方案
最优实现方案
方案一:使用Flash Attributes(推荐)
Flash Attributes 是Spring MVC专门用于跨请求传递临时数据的机制,数据会暂存于Session中,在后续单次请求完成后自动清除,非常适配表单提交这类一次性跨请求传递场景。
- 修改第一个控制器,将需要保留的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"); }
- 第二个控制器获取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注解:
- 第一个控制器添加
@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"); } }
- 第二个控制器通过
@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
相关产品推荐
相关产品推荐

