3

更新:我预计这个问题与我使用的特定 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

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

4

1 回答 1

1

我创建了一个示例,证明通常这应该有效。有关工作示例,请参阅此 git 存储库的 so-clear-spring-session-on-login 分支。

根据您的其余配置,可能有一些事情可能会导致您出现问题。

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

  • MySecurityService 的实现是什么样的?

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

于 2013-01-30T00:36:23.427 回答