我正在使用jsf的spring 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";
}