java Spring MVC、@SessionAttribute和可伸缩性
我们正在为8万用户构建一个Spring MVC web应用程序
我在petclinic示例中看到许多控制器使用:
@SessionAttribute
注释和
SessionStatus status ... status.setComplete()
存储bean并从HTTP会话中删除。确实非常有用
如果你计划为8万用户开发一个应用程序,这是最好的方式吗? 如果您计划像这样存储所有表单数据,是否仍然可以使用会话负载平衡和会话故障切换
# 1 楼答案
它可能无法满足您的需求,不。内置实现存在两个主要问题:
它实际上不支持标签浏览。如果用户在多个浏览器选项卡中加载同一屏幕,那么访问一个控制器的两个选项卡将相互碰撞对方的会话属性数据
如果用户不遵循您的“计划”导航路径,
setComplete()
调用将被错过,对象将无限期地挂起,直到会话过期并被清除1号可能是问题,也可能不是问题,这取决于你的应用程序的设计和功能。(一些东西,例如银行,故意阻止多标签的使用)但我认为大多数用户都希望能够在一个标签中编辑用户A的个人资料,在另一个标签中编辑用户B的个人资料,而不必提交一个表单来破坏另一个屏幕
第二,你可以通过总是将一个屏幕提交到它自己的控制器中,然后在清理后重定向来解决这个问题,但是如果你还没有这样构建的话,这是一个很大的工作
好消息是
org.springframework.web.bind.support.SessionAttributeStore
是一个公认的扩展点!您可以提供任何您喜欢的实现,并将其注入到dispatcher servlet中。如果希望避免业务对象使信息膨胀,甚至不需要使用Web会话来存储信息。例如,您可以将实际存储放在后端terracotta集群中,而不用担心它与您的集群策略兼容如果您真的需要真正的可伸缩性,那么总会有Gamma选项:将其重新设计成一种RESTful策略,而不是一开始就依赖服务器端状态:)