在首先提出问题之前,我描述了这个场景。我有多个servlet上下文。假设/**book**/review
url对应于book-servlet.xml,/**report**/update
对应于report-servlet.xml。
这是两个控制器
@Controller
@SessionAttributes(BookController.COMMAND_NAME)
public class BookController {
public static final String COMMAND_NAME = "login";
@GetMapping("/book/review")
public String show(ModelMap modelMap) {
modelMap.put(COMMAND_NAME, getBook());
return "redirects:" + "/report/update"; //it redirects to second controller method
}
}
@Controller
@SessionAttributes(ReportController.COMMAND_NAME)
public class ReportController {
public static final String COMMAND_NAME = "report";
@GetMapping("/report/update")
public String show(ModelMap modelMap) {
modelMap.put(COMMAND_NAME, getReport());
return "redirects:" + "/report/done";
}
}
观察这两个控制器。当我在模型中放置getBook()
时,它会在方法执行后将此对象存储在会话中,因为@SessionAttributes(BookController.COMMAND_NAME)
被添加到类定义之上。但是,在重定向到/report/update
(不同的servlet上下文)之后,我们也试图将getReport()
置于模型中。并且在处理程序方法执行之后,spring应该将对象放在会话中,就像第一种情况一样。不幸的是,对于第二个控制器,它不会将它存储在会话中。
我的问题是,如果第一个控制器方法可以成功地将其保存在会话中,为什么第二个控制器不能?或者它是用于servlet上下文切换/多个get请求或类似的东西。我需要知道它表现得奇怪的原因。我现在对@SessionAttributes感到困惑。它应该对两个控制器都一样。
答案 0 :(得分:0)
在研究了这个之后,我发现将RedirectAttributes用于这种类型的重定向场景是明智的。原因ModelMap适用于使用此ModelMap属性渲染视图的场景。并且FlashAttribute将在立即重定向到另一个处理程序方法之后继续存在,然后被擦除。所以,我使用Spring的RedirectAttrinute支持完成了我的解决方案。