12

@SessionAttributes在春天使用,但我不知道如何结束会话,我尝试了下面的代码但我收到错误,请给我一些例子。

谢谢。

@RequestMapping(value = "/LogoutAction")
public String logout(HttpServletRequest request) {
    Resource res = new ClassPathResource("spring-context.xml");
    BeanFactory factory = new XmlBeanFactory(res);
    HttpSession session = request.getSession();
    session.invalidate();
    return "Login";
}
4

2 回答 2

26

我认为使用时的常见问题@SessionAttributes是在您使当前会话无效之后,Spring MVC 将模型属性附加回新会话- 因此导致它永远不会无效的印象

您可以在无效之前和之后检查 JSESSIONID 的值。您将获得一个全新的 JSESSIONID,但之前的模型属性会直接附加到新会话中

我发现自己必须这样做才能在使会话无效后从会话中擦除名称为“计数器”的模型属性

@RequestMapping(value="/invalidate", method=RequestMethod.POST)
public String invalidate(HttpSession session, Model model) {
  session.invalidate();
  if(model.containsAttribute("counter")) model.asMap().remove("counter");
  return "redirect:/counter";
}

如果你有很多属性,当然你可以尝试使用

model.asMap().clear();

但在我看来,更好的方法是使用没有@SessionAttribute它的不同控制器来使其无效。因此,其他控制器的任何模型属性都不会直接附加到新会话中。例如:

@Controller
@RequestMapping("/logout")
public class LogoutController {

  @RequestMapping(method=RequestMethod.POST)
  public String logout(HttpSession session) {
    session.invalidate();
    return "redirect:/login";
  }
}
于 2013-06-20T06:00:23.790 回答
0

这也应该有效(类似于 gerrytan 的目的......并且晚了几年)......假设您的 @SessionAttributes 保存了您在 @ModelAtribute 方法下创建的“东西”对象:

@ModelAttribute("patient")
public Patient newPatient() {
    return new Patient();
}
/*
     other methods to do stuffs...
*/

@RequestMapping(value = "/logout")
public String logout(HttpServletRequest request, Model m) {
    HttpSession session = request.getSession(false);
    if (session != null) {
        session.invalidate();
    }
    m.addAttribute("patient", newStuff());
    return "redirect:/login"; 
}

所以基本上你捕获模型发送并设置一个新对象(存储在@SessionAtribute 中的类型),然后瞧...... SessionAttribute 仍然存在但为空......

可能不是最干净的解决方案(我是菜鸟),但适用于我的本地项目)

于 2021-12-20T23:51:27.903 回答