Vaadin23登出后重登录报错:Can't move a node from one state tree to another
Vaadin 23登出后重新登录抛出IllegalStateException的解决方法
问题根源
你当前的登出代码执行顺序错误:先调用setLocation("login")跳转页面,再去失效HttpSession和关闭VaadinSession。这会导致旧UI的StateNode仍关联在已失效的会话上下文里,当重新登录触发导航时,系统尝试将这些遗留节点挂载到新会话的UI状态树中,直接触发异常。
修正后的登出代码
调整执行顺序,先清理会话再跳转页面,同时提前保存Page引用(避免Session关闭后无法获取UI实例):
// 提前获取Page实例,后续Session关闭后UI.getCurrent()会返回null Page page = UI.getCurrent().getPage(); // 先关闭VaadinSession,清理当前UI的所有状态节点关联 VaadinSession.getCurrent().close(); // 失效底层HttpSession,彻底销毁旧会话 VaadinSession.getCurrent().getSession().invalidate(); // 最后执行页面跳转,确保跳转请求在新会话上下文处理 page.setLocation("login");
关键说明
VaadinSession.close():会自动清理当前UI的所有StateNode,解除它们与旧会话的绑定,避免后续新会话尝试复用这些节点HttpSession.invalidate():彻底销毁底层的Servlet会话,确保所有会话相关数据被清除- 提前获取Page:因为Session关闭后,
UI.getCurrent()会返回null,无法再获取Page实例执行跳转
内容的提问来源于stack exchange,提问作者Luca Magnotta
相关产品推荐
相关产品推荐

