7

我正在使用带有 jsf 的 spring 3(注释),并且我知道如何创建会话以及之后如何使其无效......

所以当我登录并在最后使用注销按钮时,一切都很好。但问题是,如果我不单击注销按钮,会话仍然存在。如果我现在使用不同的用户登录,那么旧的会话数据仍然存在——因为旧的会话没有失效。

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

4

3 回答 3

14

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

@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";
}    
于 2012-04-09T16:42:16.767 回答
4

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

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

于 2012-04-09T17:30:44.213 回答
0

如果会话旧,则在注销后创建新会话检查session.isNew()条件,然后调用。将注销方法重定向到/login映射。它检查会话,并在您调用方法时创建新会话。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";
}
于 2016-05-03T09:12:49.697 回答