登录时清除Spring会话?

时间:2013-01-25 16:10:18

标签: spring session spring-security

更新:我预计这个问题与我使用的特定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. 以user1身份登录
  2. 访问writeSession(将会话用户名设置为“user1”)
  3. 访问readSession(日志输出:当前用户名:user1
  4. 以user2身份登录(无需注销)
  5. 访问readSession(日志输出:当前用户名: user1
  6. 请注意,如果我在步骤3和4之间退出,我会得到预期的结果(当前用户名:null

1 个答案:

答案 0 :(得分:1)

我创建了一个示例,该示例表明通常这应该有效。有关工作示例,请参阅so-clear-spring-session-on-login branch of this git repo

根据配置的其余部分,可能会有一些问题可能会导致问题。

  • 您可以分享其余的Spring Security配置吗?例如,如果要在HTTP和HTTPS之间切换,则可能正在切换正在使用的会话。您可以参考Spring Security FAQ了解会话可能出现的问题的详细信息。

  • MySecurityService的实现是什么样的?

  • 您的web.xml是什么样的?