Как зарегистрировать MainView для ComponentEvent, который запускается другим View? - PullRequest
0 голосов
/ 17 марта 2020

Как зарегистрировать MainView для события, которое запускается другим представлением?

Я пытался ComponentUtil.addListener () , но он не работает для меня , С другой стороны, я даже не уверен, создано ли представление, которое вызывает событие, даже в точке, которую MainView может зарегистрировать для события?

Поток приложения:

открыть приложение -> MainView -> перенаправить, если пользователь не аутентифицирован -> LoginView -> SuccessfulAuthenticationEvent -> MainView реагирует на SuccessfulAuthenticationEvent, запущенное LoginView

Событие:

public class SuccessfulAuthenticationEvent extends ComponentEvent<LoginForm> {
    public SuccessfulAuthenticationEvent(LoginForm source, boolean fromClient) {
        super(source, fromClient);
    }
}

MainView:

public class MainView extends AppLayout implements ComponentEventListener<SuccessfulAuthenticationEvent> {
    ...
    @Override
    public void onComponentEvent(SuccessfulAuthenticationEvent event) {
        System.out.println("SuccessfulAuthenticationEvent catched");
    }
}

LoginView:

public class LoginView extends Div {
    ...
    @Override
    public void executeAfterAuthentication() {
        fireEvent(new SuccessfulAuthenticationEvent(loginForm, false));
    }
}

1 Ответ

2 голосов
/ 17 марта 2020

Я бы использовал другой подход, более надежный.

В представлении входа в систему. Если вход выполнен успешно, сохраните атрибут сеанса, указывающий, что пользователь вошел в систему, например,

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(""));
...