我认为使用时的常见问题@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";
}
}