@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 支持来完成我的解决方案
在提问之前,我先描述一下场景。我有多个 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 支持来完成我的解决方案