防止会话的并发修改



在运行应用程序的多个负载均衡实例时,是否有可能防止会话的同时修改?

上下文:多个tomcats,全部运行相同的应用程序。该应用程序使用春季会话将会话存储在Redis群集中。负载平衡器将传入的请求分发给其中一个tomcats(非粘性)。用户命中按钮,tomcat 1非常缓慢地处理请求(性能问题或其他)。用户命中按钮再次,Tomcat 2要快得多,并且回复了成功。用户继续以下页面。tomcat 1完成了第一个请求并覆盖会话 - 所有程序页面的数据都丢失了。

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

很多ab

春季会话不使用任何会话锁定机制,因为这将对性能产生非常负面的影响。请注意,您的示例专注于单个对话,而锁会影响所有请求属于给定会话的所有请求,其中许多是完全安全的,可以同时执行。

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

还要注意,春季会话提供的大多数会话存储库实现提供了写作操作的优化,其目标是减少比赛条件 - 这包括在保存之前检查会话是否进行修改,在某些情况下,还包括优化的保存操作,只有改变的属性。由于基础数据存储的不同性质,每个会话存储库中的处理都不同,因此请检查您选择的存储库中的SessionRepository#save实现。

也许有些相关,春季会话与Spring Security的并发会话控件从发行版1.3.0开始(在撰写本文时,在Release Cantix阶段)开始。您可以查看参考手册以获取详细信息。