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

@SessionAttributes not working properly for consecutive get requests

在提问之前,我先描述一下场景。我有多个 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) 是在 class 定义之上添加的。但是,在重定向到 /report/update(不同的 servlet 上下文)之后,我们还试图将 getReport() 放入模型中。在处理程序方法执行后 spring 应该将对象放入会话中,就像它对第一个 case.Unfortunately 对于第二个控制器所做的那样,它不会将其存储在会话中。

我的问题是,如果第一个控制器方法可以成功将其保存在会话中,为什么第二个控制器不能?还是用于 servlet 上下文切换/多个获取请求或类似的东西。请我需要知道它行为怪异的原因。我现在对@SessionAttributes 完全感到困惑。它应该对两个控制器都有效。

经过研究,我发现在这种类型的重定向场景中使用 RedirectAttributes 是明智的。原因 ModelMap 适用于使用此 ModelMap 属性呈现视图的场景。而 FlashAttribute 将在立即重定向到另一个处理程序方法后继续存在,然后被擦除。因此,我使用 spring.

的 RedirectAttrinute 支持来完成我的解决方案