更新:我希望这个问题与我使用的特定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");
  ...
}


然后我:


以用户1身份登录
访问writeSession(将会话用户名设置为“ user1”)
访问readSession(日志输出:当前用户名:user1)
以user2身份登录(不注销)
访问readSession(日志输出:当前用户名:user1)


请注意,如果我在第3步和第4步之间注销,则会得到预期的结果(当前用户名:null)

最佳答案

我创建了一个示例,演示了一般情况下应该可以使用。有关工作示例,请参见so-clear-spring-session-on-login branch of this git repo

根据配置的其余部分,可能有几件事可能会导致您出现问题。


您可以共享其余的Spring Security配置吗?例如,如果要在HTTP和HTTPS之间切换,则可能正在切换正在使用的会话。您可能会参考Spring Security FAQ以获得有关会话可能会出错的更多详细信息。
MySecurityService的实现是什么样的?
您的web.xml是什么样的?

07-27 18:30