【问题标题】:Spring concurrent session control error disappears after page refresh页面刷新后Spring并发会话控制错误消失
【发布时间】:2013-01-22 07:32:23
【问题描述】:

我的流程:

  1. 在 browser1 (session1) 中为 User1 启动会话
  2. 在 browser2 (session2) 中以 User1 身份登录
  3. 在 browser1 中刷新页面 - 显示错误: '此会话已过期(可能是由于同一用户同时尝试多次登录)
  4. 再次刷新 browser1 中的页面 - 旧会话成功恢复

我怎样才能结束 session1?

我的弹簧配置:

<session-management session-fixation-protection="migrateSession">
    <concurrency-control max-sessions="1" error-if-maximum-exceeded="false"/>
</session-management>

【问题讨论】:

  • 5.在 browser2 中刷新页面 - 您会看到显示错误:'This session has been expired' 这就是它的工作原理,查看替代解决方案将 error-if-maximum-exceeded 设置为 true 直到您在 browser1 中的会话过期将无法在 browser2 上登录。
  • 但是如果我想允许再登录一次,但破坏之前的登录会话?有可能吗?
  • 有可能,事实上就是这样——当你执行4.时,浏览器1中会创建一个new会话。跨度>
  • 是的,但实际上它并没有被破坏,因为你可以刷新页面并且会话会恢复,这对我来说不合适
  • 会话将恢复,new将创建一个。这和上面描述的场景是一样的:在2.中,当你登录browser2并创建session2时,session1被标记为过期。然后当你再次登录browser1时,你会得到关于无效(过期)会话的信息,但是在刷新browser1之后,session2被标记为过期,并且在browser1中创建了session3。你可以重复这个过程,这就是它的工作原理。

标签: java spring spring-security


【解决方案1】:

它使用记住我登录来再次登录您的作用。您可以将过期的会话重定向到下面给出的另一个 url 并手动使当前会话过期

在安全配置中:

(只需添加过期的url属性)

.sessionManagement().sessionAuthenticationStrategy(concurrentSessionControlStrategy)
   .maximumSessions(1).maxSessionsPreventsLogin(false).expiredUrl("/users/expire-me")

在 fwd api/url 中:

@RequestMapping(value="expire-me", method=RequestMethod.GET)
@ResponseBody
public void expireSession(HttpServletRequest request,HttpServletResponse response) throws IOException {
    request.getSession(false).invalidate();
}

这就是我所做的,而且效果很好。

【讨论】:

    【解决方案2】:

    (另一种解决方法)您也必须使用记住我身份验证,这就是您的第一个浏览器重新登录的方式。如果您希望它正常工作,请不要使用remember-me

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2019-05-16
      • 2014-08-16
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多