我使用弹簧3(注释)与jsf,我知道如何创建一个会话,并知道如何使它失效之后...如何在春季创建新会话?
因此,当我登录并在最后使用注销按钮,然后everthing作品大。但问题是,如果我不点击注销按钮,会话仍然存在。如果我现在用不同的用户登录,那么旧的会话数据仍然存在 - 因为旧的会话没有失效。
因此,如果旧会话未失效,我如何强制系统创建新会话?
我使用弹簧3(注释)与jsf,我知道如何创建一个会话,并知道如何使它失效之后...如何在春季创建新会话?
因此,当我登录并在最后使用注销按钮,然后everthing作品大。但问题是,如果我不点击注销按钮,会话仍然存在。如果我现在用不同的用户登录,那么旧的会话数据仍然存在 - 因为旧的会话没有失效。
因此,如果旧会话未失效,我如何强制系统创建新会话?
当以这种方式在用户登录,他们是否已经注销与否,你开始的新鲜,应清除会话:
@RequestMapping("login")
public String login(LoginForm form, HttpServletRequest request, HttpSession session) {
session.invalidate();
HttpSession newSession = request.getSession(); // create session
// log the user in
return "successPage";
}
史蒂夫的回答是好。为了增加更多上下文,您应该始终无效,并在用户身份验证事件后创建新会话,作为针对会话修复攻击的最佳做法。
另一种实现你要做的就是使用Spring Security。我不确定你是否考虑过它,但默认情况下,它会处理无效并在每个用户登录时为您生成新会话。此外,它还有其他功能,您可能会或可能不会觉得有用。此链接可能有帮助:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ns-config.html。滚动到部分“3.3.3 /会话固定攻击保护” relavent资讯提供给您的问题
你是对的,看起来像春季安全正是我所期待的。谢谢! – picobas 2012-04-09 18:27:21
+1用于推荐Spring Security – 2012-04-09 19:23:07
注销检查后,创建新的会话session.isNew()
条件如果会议是老然后调用invalidate()
。将登出方法重定向至/登录映射。它会检查会话和它会在您拨打invalidate()
方法时创建新会话。
退出代码:
@RequestMapping("/logout")
public String logout() {
return "redirect:/login";
}
登录代码:
@RequestMapping(value = "/login")
public String login(HttpServletRequest request, HttpSession session) {
/*
* create new session if session is not new
*/
if (!session.isNew()) {
session.invalidate();
}
return "login";
}
感谢您的回复,这是非常有帮助的! – picobas 2012-04-09 18:34:22