@SessionAttributes对连续的get请求不能正常工作

时间:2018-05-21 16:45:31

标签: java spring spring-mvc session modelattribute

在首先提出问题之前,我描述了这个场景。我有多个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感到困惑。它应该对两个控制器都一样。

1 个答案:

答案 0 :(得分:0)

在研究了这个之后,我发现将RedirectAttributes用于这种类型的重定向场景是明智的。原因ModelMap适用于使用此ModelMap属性渲染视图的场景。并且FlashAttribute将在立即重定向到另一个处理程序方法之后继续存在,然后被擦除。所以,我使用Spring的RedirectAttrinute支持完成了我的解决方案。