Vaadin Flow 在页面重新加载时重定向到特定路由

Vaadin Flow Redirect to Specific Route on Page Reload

我正在使用 Vaadin Flow。我遇到一个问题,在我导航到一条路线后,如果我重新加载页面,我仍然会停留在同一页面上(我想这应该是这样工作的)。我希望在重新加载时重定向到特定路线。比如捕获重新加载事件并重定向到特定路由。

例如

http://localhost:9090/user - 我现在所在的路由

http://localhost:9090/ - 我需要在页面重新加载时导航到的路径。

提前致谢。

你的问题不是很清楚你只是想

a) 别名或

b) 创建一个仅显示一次的视图,然后将用户重定向到其他地方。

对于别名,有一个使用 @RouteAlias 注释的非常简单的解决方案。这使得向视图添加多个路由成为可能。

@Route(value = "", layout = MainLayout.class)
@RouteAlias(value = "main", layout = MainLayout.class)
public class MainView extends VerticalLayout {
    ...
}

对于第二种情况,我会研究 BeforeEnterEvent,它在导航期间触发并有助于重定向(参见:https://vaadin.com/docs/v14/flow/routing/tutorial-routing-lifecycle)。您还需要 @PreserveOnRefresh,否则将创建新的视图实例并且计数将始终为零。

@PreserveOnRefresh
@Route(value = "", layout = MainLayout.class)
public class MainView extends VerticalLayout implements BeforeEnterObserver {

    private int count = 0;

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        if (count > 0) {
            event.forwardTo(OtherView.class);
        }
        count++;
    }
}

如果您希望将导航限制到该视图,以便它只能通过您的应用程序发生,而不是通过直接 link(或刷新),那么您可以使用 BeforeEnterObserver并检查 NavigationTrigger.

当直接通过URL导航或刷新浏览器选项卡时它将是PAGE_LOAD,当使用RouterLink时将是ROUTER_LINK,当使用UI_NAVIGATE时将是UI_NAVIGATE UI#navigate.

请注意,即使您尚未创建路由器,用户也可以在浏览器中创建路由器 link,因此您不应依赖它来确保安全。

@Route
public class ExampleView extends VerticalLayout implements BeforeEnterObserver {

    public ExampleView() {
        add("Hello");
    }

    @Override
    public void beforeEnter(BeforeEnterEvent beforeEnterEvent) {
        if (beforeEnterEvent.getTrigger() == NavigationTrigger.PAGE_LOAD) {
            beforeEnterEvent.rerouteTo(MainView.class);
        }
    }
}