猿问

Spring 清除会话范围 bean

我创建了一个会话范围的 bean,如下所示:


@Bean

@Scope(

    value = WebApplicationContext.SCOPE_SESSION,

    proxyMode = ScopedProxyMode.TARGET_CLASS)

public TodoList todos() {

    return new TodoList();

}

我已将 bean 添加为模型属性,并且可以在多个页面上显示 bean。


@GetMapping("/todos.html")

public String list(Model model) {

    model.addAttribute("todos", todos);

    return "scopedproxytodos";

}

但我不确定如何清除会话中的属性。


@PostMapping("/end")

public ModelAndView endSession(SessionStatus sessionStatus, Model model) {

    model.addAttribute("todos", new TodoList());

    sessionStatus.setComplete();

    return new ModelAndView("redirect:/");

}


慕哥9229398
浏览 106回答 1
1回答

蓝山帝景

我已将 bean 添加为模型属性,并且可以在多个页面上显示 bean:...`model.addAttribute("todos", todos);`...并不真地。这仅在当前视图中添加该属性。为了实现这一点,你应该TodoList用@SessionScope以下注释你的类:@SessionScope@Componentpublic class TodoList {    // ...}然后注释需要具有todoswith对话范围的控制器@SessionAttributes,并将其注入 with @ModelAttribute。未经测试,但类似的东西:@Controller@SessionAttributes("todos")public class FooController {   @GetMapping("/todos.html")  public String list(@ModelAttribute TodoList todos) {    // set the todos value    return "scopedproxytodos";  }}您可以在任何其他带有 注释的控制器中使用它@SessionAttributes("todos")。要删除todos当前对话会话,请 status.setComplete()像您一样使用。在你的情况下,你可以删除它:@PostMapping("/end")public ModelAndView endSession(SessionStatus sessionStatus, Model model) {    sessionStatus.setComplete();    return new ModelAndView("redirect:/");}并让具有会话范围的控制器根据需要重新初始化它(FooController实际上是这样做的)。另一种方法是重新初始化它而不是删除它。例如 :@PostMapping("/end")public ModelAndView endSession(@ModelAttribute TodoList todos) {    todos.clear();    return new ModelAndView("redirect:/");}该解决方案的优点:更简洁/更少冗长不需要为每个会话创建 bean。就开销而言,Bean 比存储在会话中的值更昂贵。该类SessionStatus管理 spring 会话的属性:可以注入到处理程序方法中的简单接口,允许它们发出会话处理已完成的信号。然后,处理程序调用程序可以进行适当的清理,例如在此处理程序的处理期间隐式创建的会话属性这意味着它清除了存储在 Spring 处理程序会话中的属性(与经典的 http 会话不同),而不是存储在 http 请求中的属性,实际上您没有在 spring 会话属性中添加任何内容。所以那是没用的。
随时随地看视频慕课网APP

相关分类

Java
我要回答