首页 文章

spring会话 - 防止会话的并发修改

提问于
浏览
0

是否可以在运行应用程序的多个负载 balancer 实例时阻止会话的并发修改?

上下文:多个tomcats,都运行相同的应用程序 . 应用程序使用spring会话将会话存储在redis群集中 . 负载均衡器将传入的请求分配给其中一个tomcats(非粘性) . 用户点击按钮,tomcat 1处理请求非常缓慢(性能问题或其他) . 用户再次点击按钮,tomcat 2更快,并回复成功 . 用户进入以下页面 . Tomcat 1完成第一个请求并覆盖会话 - 所有进行中的页面的数据都将丢失 .

解决方案是锁定会话 . 因此,tomcat 2可以检测并发修改并回复错误(比获得不一致状态好得多) .

很多AB

1 回答

  • 1

    Spring Session不使用任何会话锁定机制,因为这会对性能产生非常不利的影响 . 请注意,您的示例侧重于单个会话,而锁定会影响属于给定会话的所有请求,其中许多请求可以非常安全地同时执行 .

    对于您示例中的场景,应采用另一种机制来提供保护 . 这可能很简单,比如在操作完成之前禁用UI上的按钮,从而阻止后续请求,或使用CSRF保护,这将确保每个修改服务器端的请求 .

    另请注意,Spring Session提供的大多数会话存储库实现都提供了写操作的优化,其目标是减少竞争条件 - 这包括在保存之前检查会话以进行修改,以及在某些情况下优化的只写属性的保存操作那已经改变了 . 由于底层数据存储的性质不同,每个会话存储库中的处理方式不同,因此请检查您选择的存储库中的 SessionRepository#save 实现 .

    也许有点相关,Spring Session提供了与Spring Security的并发会话控制的集成,从发布 1.3.0 开始(在撰写本文时,在发布候选阶段) . 您可以查看reference manual了解详情 .

相关问题