2012-04-09 116 views
3

我使用弹簧3(注释)与jsf,我知道如何创建一个会话,并知道如何使它失效之后...如何在春季创建新会话?

因此,当我登录并在最后使用注销按钮,然后everthing作品大。但问题是,如果我不点击注销按钮,会话仍然存在。如果我现在用不同的用户登录,那么旧的会话数据仍然存在 - 因为旧的会话没有失效。

因此,如果旧会话未失效,我如何强制系统创建新会话?

回答

6

当以这种方式在用户登录,他们是否已经注销与否,你开始的新鲜,应清除会话:

@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"; 
}  
+0

感谢您的回复,这是非常有帮助的! – picobas 2012-04-09 18:34:22

4

史蒂夫的回答是好。为了增加更多上下文,您应该始终无效,并在用户身份验证事件后创建新会话,作为针对会话修复攻击的最佳做法。

另一种实现你要做的就是使用Spring Security。我不确定你是否考虑过它,但默认情况下,它会处理无效并在每个用户登录时为您生成新会话。此外,它还有其他功能,您可能会或可能不会觉得有用。此链接可能有帮助:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/ns-config.html。滚动到部分“3.3.3 /会话固定攻击保护” relavent资讯提供给您的问题

+0

你是对的,看起来像春季安全正是我所期待的。谢谢! – picobas 2012-04-09 18:27:21

+1

+1用于推荐Spring Security – 2012-04-09 19:23:07

0

注销检查后,创建新的会话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"; 
}