Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在春季创建新会话?_Java_Spring_Session - Fatal编程技术网

Java 如何在春季创建新会话?

Java 如何在春季创建新会话?,java,spring,session,Java,Spring,Session,我将Spring3(注释)与jsf一起使用,我知道如何创建会话以及如何在之后使其无效 所以当我登录并在最后使用注销按钮时,一切都很好。但问题是,如果我不点击注销按钮,会话仍然存在。如果我现在使用另一个用户登录,那么旧会话数据仍然存在,因为旧会话没有失效 因此,如果旧会话未失效,我如何强制系统创建新会话?用户登录时,您应该清除该会话。这样,无论他们是否已注销,您都可以重新开始: @RequestMapping("login") public String login(LoginForm form,

我将Spring3(注释)与jsf一起使用,我知道如何创建会话以及如何在之后使其无效

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


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

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

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

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


另一种实现您希望做的事情的方法是使用SpringSecurity。我不确定您是否考虑过它,但默认情况下,它将在每次用户登录时处理无效和生成新会话。此外,它还有其他一些功能,您可能会觉得有用,也可能不会觉得有用。此链接可能有帮助:。滚动至“3.3.3/会话固定攻击保护”部分,获取您问题的相关信息

以在注销后创建新会话检查
会话。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";
}
登录代码:

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

你说得对,看来春天安全正是我想要的。谢谢