【问题标题】:How can I reroute in BeforeEnterObserver in the view before AppLayout is rendered in Vaadin 14 (Vaadin Flow)在 Vaadin 14(Vaadin Flow)中呈现 AppLayout 之前,如何在视图中的 BeforeEnterObserver 中重新路由
【发布时间】:2021-07-19 17:29:56
【问题描述】:

例如,让我有:

public class MainView extends AppLayout {
   public MainView() {
      User user = VaadinSession.getAttribute("user");
      if(user.isCheckSomething())
          Span span = new Span("Hello " + user.getFirstname());
   }
}

如果用户尚未登录,这将失败并出现 NPE,因为从会话中获取用户将为空。现在我可以在if(user.isCheckSomething()) 之前添加一个空检查,但理想情况下,如果用户未登录,我宁愿根本不呈现AppLayout。也就是说,我宁愿通过BeforeEnterObserver 在视图中失败public void beforeEnter(BeforeEnterEvent event) 方法,但是 AppLayout 在调用 beforeEnter(...) 方法之前被调用和创建。

换句话说,如果用户没有通过视图登录,我如何强制完全跳过 AppLayout 的实例化,从而永远不会构造 AppLayout

【问题讨论】:

    标签: vaadin vaadin-flow vaadin14


    【解决方案1】:

    根据经验,在构造函数中以任何方式使用 UI 确实不可靠,因为它尚未初始化。

    AppLayout 有自己的 afterNavigation 方法,应该在 BeforeEnterEvent 之后调用。

    public class MainView extends AppLayout {
        @Override
        protected void afterNavigation() {
            super.afterNavigation();
            User user = VaadinSession.getAttribute("user");
            if(user.isCheckSomething())
                Span span = new Span("Hello " + user.getFirstname());
        }
    

    所以在 beforeEnter 方法中你将重新路由到登录,否则父布局的后导航将被触发。

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        if (!isAuthenticated()) {
            event.rerouteTo(LoginView.class);
        }
    }
    

    您可以在每个视图中实现BeforeEnterObserver 并检查用户是否一遍又一遍地进行身份验证...或者您可以执行一次:

    @SpringComponent
    public class AuthenticationControl implements VaadinServiceInitListener {
         @Override
        public void serviceInit(ServiceInitEvent event) {
            event.getSource().addUIInitListener(uiEvent -> {
                final UI ui = uiEvent.getUI();
                ui.addBeforeEnterListener(/* do the check here, either with a method reference or create a separate listener class */);
            });
         }
    }
    

    【讨论】:

    • 谢谢,这确实帮了很多忙。我没有意识到该界面在 AppLayout 上受到尊重。并感谢您提供身份验证提示。作为转换 Vaadin 8 网络应用程序的一部分,我正朝着这个方向前进,但还没有完全实现。
    • @StephaneGrenier 有趣的是,AppLayout 定义了自己的 afterNavigation() 方法,这与 AfterNavigationObserver 的 afterNavigation(AfterNavigationEvent) 并不完全相同。但我认为您也可以在 AppLayout 子类上使用该接口,因为它应该适用于 any 组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多