Vaadin 8中setLogoutURL方法的替代方案是什么?用于关闭浏览器弹窗
Vaadin 8 关闭弹窗场景的替代实现方案
你原来在Vaadin 6中使用setLogoutURL的逻辑,在Vaadin 8中有两种完全兼容的替代方案,均可避免你担心的竞态问题:
方案1:复用原有关闭Servlet(改造成本最低)
Vaadin 8没有提供直接的setLogoutURL方法,你可以通过Page对象直接触发重定向,和Vaadin 6的逻辑完全一致:
// 若需要销毁会话可先调用logout VaadinService.getCurrent().logout(); // 标记当前UI关闭 myUI.close(); // 重定向到你原来的关闭专用Servlet Page.getCurrent().setLocation("/your-close-servlet-path");
前端收到响应后会先处理UI关闭逻辑,再执行重定向,跳转至Servlet后返回带window.close()的JS即可完成弹窗关闭,不存在顺序问题。
方案2:无需额外Servlet,直接执行关闭JS
如果不想维护额外的Servlet,可以通过调整JS执行时机规避竞态:
myUI.close(); // 加0ms延迟让JS在Vaadin前端完成UI关闭逻辑后再执行 JavaScript.getCurrent().execute("setTimeout(() => window.close(), 0);");
Vaadin客户端会按服务器端的调用顺序处理指令,加setTimeout是为了把关闭窗口的操作放到浏览器事件队列末尾,确保Vaadin的UI卸载逻辑完全执行完成后再关闭窗口,完全解决竞态问题。
注意事项
只有由JS主动打开的弹窗才能通过window.close()直接关闭,若为用户手动打开的窗口,浏览器会出于安全策略拦截关闭操作,该限制和Vaadin框架无关。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

