在 vaadin 中强制注销用户。如何显示消息以强制注销用户
Forcing logout of a user in vaadin. How to show a message to force logged out user
在我的 vaadin 网络应用程序中,管理员用户应该能够强制注销当前登录的用户。当用户被强制注销时,应该立即将他重定向到登录页面,并向用户显示一条错误消息,告知他已被强制注销。
到目前为止,我已经编写了以下代码,成功地将用户注销到登录页面。
try {
vaadinSession.lock(); //The session to be forcefully logged out
try {
vaadinSession.getUIs().forEach(ui -> {
if (ui.getPage() != null) {
ui.getPage().setLocation("");
ui.push();
Notification notification = new Notification("You have been forcefully logged out", Notification.Type.WARNING_MESSAGE);
notification.setDelayMsec(-1);
notification.show(ui.getPage());
ui.push();
}
});
} catch (Exception e) {
logger.error("Exception triggered when redirecting pages on forceDisconnect " + e.getLocalizedMessage(), e);
}
vaadinSession.close();
} finally {
vaadinSession.unlock();
}
但是,代码中显示的通知实际上并未显示给用户。我认为这是因为在调用 vaadinSession.close();
时创建了一个新的 Vaadin 会话。如果我在新的 vaadin 会话中显示通知,我认为它会成功显示。
但是,我不知道如何在调用 vaadinSession.close();
后访问新会话。
谁能告诉我如何实现这个目标?
可能不理想,但以下是我最终完成的方法。
在forceDisconnect()
方法中,将消息设置为VaadinSession底层会话中的会话变量
vaadinSession.getSession().setAttribute("PrevSessionError", "You have been forcefully logged out");
在登录视图的 attach()
中,如果找到之前设置的变量,则向用户显示消息。
@Override
public void attach() {
super.attach();
Object previousSessionError = getSession().getSession().getAttribute("PrevSessionError");
if (previousSessionError != null) {
Notification notification = new Notification(previousSessionError.toString(), Notification.Type.ERROR_MESSAGE);
notification.setDelayMsec(-1);
notification.show(getUI().getPage());
getSession().getSession().setAttribute("PrevSessionError", null);
}
}
这是有效的,因为即使 VaadinSession
发生变化,基础会话也不会改变。不知道靠不靠谱,只能这样了
在我的 vaadin 网络应用程序中,管理员用户应该能够强制注销当前登录的用户。当用户被强制注销时,应该立即将他重定向到登录页面,并向用户显示一条错误消息,告知他已被强制注销。
到目前为止,我已经编写了以下代码,成功地将用户注销到登录页面。
try {
vaadinSession.lock(); //The session to be forcefully logged out
try {
vaadinSession.getUIs().forEach(ui -> {
if (ui.getPage() != null) {
ui.getPage().setLocation("");
ui.push();
Notification notification = new Notification("You have been forcefully logged out", Notification.Type.WARNING_MESSAGE);
notification.setDelayMsec(-1);
notification.show(ui.getPage());
ui.push();
}
});
} catch (Exception e) {
logger.error("Exception triggered when redirecting pages on forceDisconnect " + e.getLocalizedMessage(), e);
}
vaadinSession.close();
} finally {
vaadinSession.unlock();
}
但是,代码中显示的通知实际上并未显示给用户。我认为这是因为在调用 vaadinSession.close();
时创建了一个新的 Vaadin 会话。如果我在新的 vaadin 会话中显示通知,我认为它会成功显示。
但是,我不知道如何在调用 vaadinSession.close();
后访问新会话。
谁能告诉我如何实现这个目标?
可能不理想,但以下是我最终完成的方法。
在forceDisconnect()
方法中,将消息设置为VaadinSession底层会话中的会话变量
vaadinSession.getSession().setAttribute("PrevSessionError", "You have been forcefully logged out");
在登录视图的 attach()
中,如果找到之前设置的变量,则向用户显示消息。
@Override
public void attach() {
super.attach();
Object previousSessionError = getSession().getSession().getAttribute("PrevSessionError");
if (previousSessionError != null) {
Notification notification = new Notification(previousSessionError.toString(), Notification.Type.ERROR_MESSAGE);
notification.setDelayMsec(-1);
notification.show(getUI().getPage());
getSession().getSession().setAttribute("PrevSessionError", null);
}
}
这是有效的,因为即使 VaadinSession
发生变化,基础会话也不会改变。不知道靠不靠谱,只能这样了