我正在使用带有 jsf 的 spring 3(注释),并且我知道如何创建会话以及之后如何使其无效......
所以当我登录并在最后使用注销按钮时,一切都很好。但问题是,如果我不单击注销按钮,会话仍然存在。如果我现在使用不同的用户登录,那么旧的会话数据仍然存在——因为旧的会话没有失效。
那么如果旧会话没有失效,我如何强制系统创建新会话?
您应该在用户登录时清除会话。这样,无论他们是否已注销,您都可以重新开始:
@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";
}
史蒂夫的回答很好。只是为了添加更多上下文,您应该始终在用户身份验证事件之后使会话无效并创建一个新会话,作为对抗会话固定攻击的最佳实践。
完成您想要做的事情的另一种方法是使用 Spring Security。我不确定您是否考虑过它,但默认情况下,它会在每个用户登录时为您处理无效和生成新会话。此外,它还具有您可能会或可能不会觉得有用的其他功能。此链接可能会有所帮助:http ://static.springsource.org/spring-security/site/docs/3.1.x/reference/ns-config.html 。滚动到“3.3.3/会话固定攻击保护”部分以获取与您的问题相关的信息
如果会话旧,则在注销后创建新会话检查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";
}