为了账号安全,请及时绑定邮箱和手机立即绑定

Spring 清除会话范围 bean

Spring 清除会话范围 bean

慕哥9229398 2023-07-28 09:42:32
我创建了一个会话范围的 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:/");}
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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


...


`model.addAttribute("todos", todos);`

...


并不真地。这仅在当前视图中添加该属性。


为了实现这一点,你应该TodoList用@SessionScope以下注释你的类:


@SessionScope

@Component

public 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 会话属性中添加任何内容。
所以那是没用的。


查看完整回答
反对 回复 2023-07-28
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信