更新:我预计这个问题与我使用的特定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");
...
}
然后我:
请注意,如果我在步骤3和4之间退出,我会得到预期的结果(当前用户名:null )
答案 0 :(得分:1)
我创建了一个示例,该示例表明通常这应该有效。有关工作示例,请参阅so-clear-spring-session-on-login branch of this git repo。
根据配置的其余部分,可能会有一些问题可能会导致问题。
您可以分享其余的Spring Security配置吗?例如,如果要在HTTP和HTTPS之间切换,则可能正在切换正在使用的会话。您可以参考Spring Security FAQ了解会话可能出现的问题的详细信息。
MySecurityService的实现是什么样的?
您的web.xml是什么样的?