更新:我预计这个问题与我使用的特定 Spring 版本有关,但 Rob 的回答表明它可能与我的环境有关。我们已经找到了解决这个特定问题的方法(一个在登录时手动清除会话的过滤器),所以我将 Rob 的答案标记为正确。
在我的 Spring 应用程序中,我的会话在登录之间保持不变。我希望在登录时清除会话。
我正在使用 Spring Security 2.0.4(不要问),我的安全配置看起来像这样
<security:http ...
session-fixation-protection="newSession">
...
<security:logout invalidate-session="true" logout-success-url="/login.html" />
</security:http>
我的印象是session-fixation-protection="newSession"会清除用户登录时的会话。另一个有趣的点是会话在注销时被清除,因此invalidate-session="true"具有预期的效果。
测试时,我使用以下方法:
@RequestMapping(value = "writeSession")
String writeSession(HttpServletRequest request) {
request.getSession().setAttribute("username", MySecurityService.getLoggedInUsername());
...
}
@RequestMapping(value = "readSession")
String readSession(HttpServletRequest request) {
log.info("Current username: " + request.getSession().getAttribute("username");
...
}
然后我:
- 以 user1 身份登录
- 访问 writeSession(将会话用户名设置为“user1”)
- 访问 readSession(日志输出:当前用户名:user1)
- 以 user2 身份登录(无需注销)
- 访问 readSession(日志输出:当前用户名:user1)
请注意,如果我在第 3 步和第 4 步之间注销,我会得到预期的结果(当前用户名:null)