Я бы использовал другой подход, более надежный.
В представлении входа в систему. Если вход выполнен успешно, сохраните атрибут сеанса, указывающий, что пользователь вошел в систему, например,
VaadinSession.getCurrent().setAttribute("userLoggedIn", true);
В вашем MainLayout реализуйте BeforeEnterObserver
и переопределите beforeEnter
метод. В методе beforeEnter
прочитайте атрибут сеанса, если он пуст на страницу входа.
@Override
public void beforeEnter(BeforeEnterEvent event) {
if (VaadinSession.getCurrent().getAttribute("userLoggedIn") == null) {
event.forwardTo(LoginView.class);
}
}
Дополнительный совет. В методе beforeEnter
вы также можете сохранить текущий маршрут и в представлении входа в систему, если вход успешный, перенаправить на сохраненный маршрут.
@Override
public void beforeEnter(BeforeEnterEvent event) {
if (VaadinSession.getCurrent().getAttribute("userLoggedIn") == null) {
VaadinSession.getCurrent().setAttribute("intendedPath", event.getLocation().getPath());
...
}
}
И в представлении входа после успешного входа в систему
Object intendedPath = VaadinSession.getCurrent().getAttribute("intendedPath");
UI.getCurrent().navigate(Optional.ofNullable(intendedPath).map(Object::toString).orElse(""));