【问题标题】:How to end the session in spring 3如何在春季结束会议 3
【发布时间】:2013-06-16 20:23:17
【问题描述】:
我在春季使用@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";
}
【问题讨论】:
标签:
spring
spring-mvc
session
【解决方案1】:
我认为使用@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";
}
}
【解决方案2】:
这也应该有效(类似于 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 仍然存在但为空……
可能不是最干净的解决方案(我是菜鸟),但适用于我的本地项目)