关闭 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();
}
}
我正在处理会话管理面板。我想通过单击按钮终止另一个用户的会话。我使用 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();
}
}