在运行应用程序的多个负载平衡实例时,是否可以防止并发修改会话?
上下文:多个tomcats,都运行相同的应用程序。该应用程序使用spring session将会话存储在redis集群中。负载均衡器将传入的请求分发给其中一个tomcats (非粘性的)。用户点击Button,Tomcat1处理请求的速度非常慢(性能问题或其他问题)。用户再次点击Button,tomcat 2的速度会快得多,并回复成功。用户进入以下页面。Tomcat 1完成第一个请求并覆盖会话-所有后续页面的数据都会丢失。
一种解决方案是锁定会话。因此,Tomcat2可以检测到并发修改并回复错误(比获得不一致的状态要好得多)。
Thx很多AB
发布于 2016-12-06 17:43:38
Spring Session不使用任何会话锁定机制,因为这会对性能产生非常负面的影响。请注意,您的示例侧重于单个会话,而锁定将影响属于给定会话的所有请求,其中许多请求在并发执行时是完全安全的。
对于示例中的场景,应该使用另一种机制来提供保护。这可以是一些简单的事情,比如禁用UI上的按钮,直到操作完成,从而阻止后续请求,或者使用CSRF保护,这将确保修改服务器端的每个请求。
还请注意,Spring session提供的大多数会话存储库实现都提供了写操作的优化,其目标是减少竞争条件-这包括在保存之前检查会话的修改,以及在某些情况下仅写入已更改的属性的优化保存操作。由于底层数据存储的性质不同,这在每个会话存储库中的处理方式都不同,因此请检查您选择的存储库中的SessionRepository#save实现。
可能有些相关,Spring Session提供了与Spring Security的并发会话控制的集成,从release 1.3.0开始(在写这篇文章的时候,是在发布候选阶段)。您可以查看reference manual以了解详细信息。
https://stackoverflow.com/questions/40977635
复制相似问题