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