如何在春季创建新会话?

时间:2012-04-09 16:23:05

标签: java spring session

我正在使用jsf的spring 3(注释),我知道如何创建一个会话以及如何使其失效...

所以当我登录并使用最后的注销按钮时,外翻效果很好。但问题是,如果我没有点击退出按钮,会话仍然存在。如果我现在使用其他用户登录,则旧会话数据仍然存在 - 因为旧会话未被无效。

那么如果旧会话没有失效,我如何强制系统创建新会话?

3 个答案:

答案 0 :(得分:10)

您应该在用户登录时清除会话。这样,无论他们是否已经注销,您都会重新开始:

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

要在退出检查session.isNew()条件后创建新会话,如果会话已久,请致电invalidate()。将注销方法重定向到 / login 映射。它会检查会话,会在您调用 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";
}