Vaadin结合Spring Boot多用户会话管理下视图隔离问题咨询
问题根因与解决方案
你遇到的视图跨用户串改问题,绝大多数场景是作用域配置不匹配导致的,可按以下步骤排查修复:
- 第一,删除视图上的
@VaadinSessionScope注解
Vaadin中被@Route标注的视图默认是@UIScope,每一个浏览器标签页对应一个独立的UI实例,每个实例会创建专属的视图对象,天然隔离不同用户、不同标签页的界面状态。你额外加了@VaadinSessionScope反而会让同一个用户的多个标签页共享同一个视图实例,引发同用户多tab的界面冲突。 - 第二,检查视图依赖的所有Bean的作用域
如果你在视图中注入了Spring默认的单例Bean,且这个Bean里存储了用户专属的界面状态、业务数据,那所有用户的视图都会共享这个单例的状态,自然会出现后登录用户看到前一个用户的修改。
如果你确实需要会话级共享的用户数据,单独封装为会话域Bean再注入:
直接在ACMEView中注入该Bean即可,框架会保证每个Vaadin会话持有独立的Bean实例,不会跨会话串数据。@Component @VaadinSessionScope public class UserSessionState { // 存储当前会话专属的界面配置、业务状态 private LocalDateTime uiLastModifiedTime; private List<CustomGuiConfig> guiConfigList; // 对应getter、setter } - 第三,排查全局静态变量的使用
如果你在任何类中用静态变量存储了用户界面相关的状态,静态变量属于JVM全局共享,无论什么作用域配置都会跨用户串数据,这类变量需要改成实例变量,或者存储到上面的会话域Bean中。 - 第四,异步场景注意上下文传递
如果你在视图逻辑中自己开启了异步线程处理业务,需要手动传递Spring Security上下文和Vaadin会话上下文,避免拿错用户数据。
内容的提问来源于stack exchange,提问作者Stimpson Cat
相关产品推荐
相关产品推荐

