Vaadin 多用户会话管理

Posted

技术标签:

【中文标题】Vaadin 多用户会话管理【英文标题】:Vaadin multi user session management 【发布时间】:2022-01-03 15:22:07 【问题描述】:

我正在使用 spring-boot 和 spring-security 创建一个 Vaadin 应用程序。有一些可以修改的 gui 元素。如何实现用户对此有自己的看法?我认为框架已经处理的问题是,当不同的用户登录时,他会看到第一个用户的修改。

我想使用 VaadinSessions 或类似的东西同时支持多个用户,修改他们自己的独占视图。

我不知道该怎么办。我尝试添加到布局:

 @VaadinSessionScope

我的幼稚方法如下所示:在我自己的地图中处理不同的用户/会话。但是我对这个解决方案思考得越多,我就越想问自己为什么不使用框架中的这些功能。如何分离视图/用户?

这是我的视图类的顶部:

@PageTitle("ACME")
@Theme(value = Lumo.class, variant = Lumo.LIGHT)
@Route
@VaadinSessionScope
public class ACMEView extends VerticalLayout 

【问题讨论】:

【参考方案1】:

Vaadin 以相反的方式工作。如果你定义例如一个带有@Route 的视图组件类,那么当每个用户导航到该视图时,他们都会有一个单独的实例。它实际上甚至比这更进一步 - 如果用户在多个浏览器选项卡中打开相同的视图,那么他们将拥有该组件类的多个实例。

您需要在组件和数据之间进行分离。如果你把@VaadinSessionScope 放在一个component 类上,那么每个用户都会有它自己的那个组件的实例。用户将彼此隔离,但如果用户打开了多个浏览器选项卡,它仍然会导致问题。出于这个原因,您几乎总是应该避免在组件类上使用范围注释。

多个用户看到相同数据的原因是 数据 是共享的,而与组件实例无关。这取决于您如何配置这些组件,而不是基于组件本身的生命周期。在 Grid 的情况下,这就是您传递给 setDataProvidersetItems 方法的内容。我怀疑您的数据要么存储在某处的 static 字段中,要么存储在具有更广泛范围的单独 Spring bean 中(Spring 中的默认范围是单例)。您可能希望将@VaadinSessionScope 应用于保存数据的bean,而不是保存组件自己的配置的组件类。

【讨论】:

您好 Leif,我今天正在阅读您的一些博客文章。感谢帮助。目前,我在 ViewClass 上方使用这些注释。请参阅已编辑的问题。但我没有得到分开的意见。当第一个用户向网格添加一些元素时,它将出现在向第二个(不同凭据)用户呈现的页面上 我想问题是你如何在后端存储这些数据。如果您的所有数据都是例如在同一个数据库表上并且您没有添加任何逻辑来按用户过滤它,所有单独的视图实例都将显示相同的数据。 我相应地扩展了答案。 如果我猜对了,(数据存储在静态地图中)我必须自己处理,或者使用您描述的弹簧机制 伙计们,我只需要删除静态修饰符 :D 再次感谢!

以上是关于Vaadin 多用户会话管理的主要内容,如果未能解决你的问题,请参考以下文章

会话超时通知

Vaadin 中的休眠会话错误

VaadinSession 的会话复制不起作用

Java Web之会话管理一: 使用Cookie进行会话管理

HTTP会话的使用和管理

高效能远程会话管理工具-screen