关闭 Session 后立即触发 destroyListener

Fire destroyListener imemdiately after close Session

我正在处理会话管理面板。我想通过单击按钮终止另一个用户的会话。我使用 VaadinSession 对象和具有 VaadinSession.close() 功能的按钮创建了网格,但在 close() 销毁会话侦听器后不会立即触发并且他的网站不会重新加载。它会在一段时间后被触发,但是当会话关闭的用户点击他网站上的任何内容时,destroyListener 会更快触发。 是否有任何选项可以在关闭会话后立即触发 DestroyListener?

VaadinSession.close() 只是 sets a flag 说明会话将要关闭。实际清理是在处理来自该会话的请求时执行的。这就是为什么单击按钮会触发 SessionDestroyListener(或者,心跳会产生相同的效果)。

使用 Vaadin 14+,您可以强制关闭会话中的每个 UI 执行无操作,以便发生服务器-客户端往返。

session.getUIs().stream().forEach(ui->ui.getElement().executeJs("return"));

当时:

a)服务器会意识到当前session已经关闭,然后session会被销毁(并替换为新的)

b) 客户端将为新会话重新加载每个浏览器选项卡。

@Push
@Route
public class MainView extends VerticalLayout {

  public MainView() {     
    ApplicationServiceInitListener.sessions.forEach(session->{
      if (session!=VaadinSession.getCurrent()) {
        Button btn = new Button("Close "+session.hashCode());       
        btn.addClickListener(ev->{session.access(()->close(session)); remove(btn);});
        add(btn);
      }});
  }

  private void close(VaadinSession session) {
      session.getUIs().stream().forEach(ui->ui.getElement().executeJs("return"));
      session.close();
  }


}