`
龙儿筝
  • 浏览: 10116 次
社区版块
存档分类
最新评论

鸿蒙Navigation拦截器实现页面跳转登录鉴权方案

阅读更多

我们在进行页面跳转时,很多情况下都得考虑登录状态问题,比如进入个人信息页面,下单交易页面等等。在这些场景下,通常在页面跳转前,会先判断下用户是否已经登录,若已登录,则跳转到相应的目标页面,若没有登录,则先跳转到登录页面,然后等着获取登录状态,若登录页面关闭时,能获取到已登录,则继续跳转到目标页,若用户取消了登录,则终止后面的行为。这样的处理通常会存在一些问题,例如很多页面都与登录状态相关,这样需要在大量的入口处增加登录逻辑判断。即使封装成一个方法,也需要关心是否登录成功,增加了逻辑的复杂性,而且登录页面先关闭,再打开新页面,页面切换动画也很不协调。

那么我们有没有一种更好的方案来处理登录鉴权问题呢?首先我们先梳理一下我们想要的效果,我们的目的是要跳转到相应的目标页,目标页是否需要先登录,我们是不太愿意关注的,最好是内部自己处理掉,,若没有登录,就先进行登录,登录成功后,继续后面的行为,外面使用的地方尽量做到无感知。总结一下就是进行页面跳转时,内部先判断一下状态,然后再进行后续的行为,而这恰好是Navigation拦截器的功能。

Navigation拦截器的介绍与使用

NavPathStack提供了setInterception方法,用于设置Navigation页面跳转拦截回调。该方法需要传一个NavigationInterception对象,该对象包含三个回调函数willShow,didShow和modeChange,我们在willShow页面即将显示时,进行拦截处理。先判断是否登录,没有登录,就重定向到登录页面,若已登录,则继续后续行为,不做拦截。示例如下

@Entry
@ComponentV2
struct Index {
  nav: NavPathStack = new NavPathStack()
  isLogin: boolean = false

  aboutToAppear(): void {
    this.nav.setInterception({
      willShow: (from: NavDestinationContext | NavBar, to: NavDestinationContext | NavBar,
        operation: NavigationOperation, isAnimated: boolean) => {
        if (typeof to === 'object') {
          if (isLogin) {
            AppRouter.popPage()
            AppRouter.jumpPage('login', undefined)
          }
        }
      }
    })
  }

  build() {
    Navigation(this.nav)
    .hideToolBar(true)
    .hideTitleBar(true)
    .height('100%')
    .width('100%')
  }
}
 

拦截器细节优化

如何判断是否需要进行拦截

在拦截器中,虽然我们可以进行拦截重定向跳转,但需要考虑的一个问题是什么情况下进行拦截,也就是哪些页面跳转时需要先判断下登录状态。首先想到的是弄一个数组,所有需要登录校验的页面都放到这个数组中。页面跳转时,我们只需要判断下目标页是否在数组中,就可以知道是否需要进行拦截校验登录了。其实思想是对的,只是我们有更简单的实现方式。在系统路由表中,有一个data字段,可以在这个字段中增加一个字段,是否需要登录,在拦截器中先获取目标页中这个参数,只要所有需要登录的页面,都添加了这个字段就可以了。我们以用户信息页为例,配置如下

{
  "routerMap": [
    {
      "name": "login",
      "pageSourceFile": "src/main/ets/pages/login/LoginPage.ets",
      "buildFunction": "loginBuilder"
    },
    {
      "name": "user_info",
      "pageSourceFile": "src/main/ets/pages/user/UserInfoPage.ets",
      "buildFunction": "userInfoBuilder",
      "data": {
        "needLogin": "1"
      }
    }
  ]
}
 

拦截器中获取该字段的方式如下

this.nav.setInterception({
  willShow: (from: NavDestinationContext | NavBar, to: NavDestinationContext | NavBar,
    operation: NavigationOperation, isAnimated: boolean) => {
    if (typeof to === 'object') {
      const data = (to as NavDestinationContext).getConfigInRouteMap()?.data
      if (data !== undefined && (data as object)['needLogin'] === '1' && !AppConstant.hasLogin) {
        AppRouter.popPage()
        AppRouter.jumpPage(Pages.login, undefined)
      }
    }
  }
})
 

登录成功后如何获取目标页和页面参数

登录成功后,我们如何知道要跳转到哪个目标页,以及跳转到目标页时所需要的参数呢?我们在跳转到登录页时可以增加2个参数targetPage和targetParam,分别表示要处理的目标页以及相应的参数,若targetPage的值为undefined,则说明登录成功后没有后续操作,若有值,则跳转到这个页面并把相应的参数传过去。在拦截器中,可以通过to.pathInfo.name获取到目标页的名称name以及通过to.pathInfo.param获取到目标页所需要的参数,并把它们赋值给登录页面的targetPage和targetParam就行了。

我们可以发现使用拦截器这种方式,完全符合我们最初的设想,外部调用时不用考虑是否要校验登录状态,由拦截器内部自己处理。登录后也是直接跳转到目标也,没有页面关闭效果。而且是否需要判断登录,只需配置一个字段就行了,非常方便。

0
0
分享到:
评论

相关推荐

    ARouter路由实现拦截跳转

    ARouter提供拦截器机制,用于在路由跳转前进行一些额外的操作,比如权限检查、登录状态验证等。创建一个自定义的Interceptor类,继承`com.alibaba.android.arouter.core.Interceptor`,并在其中实现`intercept...

    基于鸿蒙Navigation系统路由表和Hvigor插件的动态路由方案(源码+说明文档).zip

    支持多个拦截器(支持优先级和中断拦截)和全局拦截器,可实现页面跳转和显示、埋点、登录等拦截处理; 支持服务路由,可在相互独立的Har/Hsp模块间通信; 支持组件的生命周期管理,以及跨多级页面参数回传接收; 支持...

    qt-quick QML页面跳转

    下面我们将深入探讨如何在Qt Quick中实现QML页面跳转,包括单页面跳转和多页面跳转。 首先,我们需要理解QML的基本结构。一个QML文件通常代表一个可视化的组件或页面。通过定义`Item`或其子类(如`Rectangle`、`...

    ZRouter是基于鸿蒙Navigation系统路由表和Hvigor插件实现的动态路由方案,以解决模块间的耦合问题

    ZRouter是基于鸿蒙Navigation系统路由表和Hvigor插件实现的动态路由方案,以解决模块间的耦合问题

    iOS 实现页面跳转

    我们将讨论两种主要的页面跳转方式:模态(Modal)展示和导航控制器(Navigation Controller)的使用,同时也会涉及控件的生命周期以及UIButton等基础控件的属性。 一、模态页面跳转 模态页面跳转通常用于向用户...

    WPF学习之页面跳转

    在WPF中,页面跳转是实现应用内部导航的关键功能,对于构建多视图、模块化的应用程序至关重要。本教程将深入探讨如何在WPF中进行页面之间的导航,并涉及到动态添加控件的技巧。 一、WPF页面基础 在WPF中,`Page`类...

    本人的一个APP程序,实现页面跳转

    本文将详细探讨如何在Android平台上实现页面跳转,因为从标题和描述来看,这是一个关于Android APP程序的页面跳转问题。Android应用通常使用Java或Kotlin编写,我们将基于这两种语言来讲解页面跳转的实现方法。 1. ...

    ZRouter是基于鸿蒙Navigation系统路由表和Hvigor插件实现的动态路由方案,以解决模块间的耦合与通信问题

    ZRouter是基于鸿蒙Navigation系统路由表和Hvigor插件实现的动态路由方案,以解决模块间的耦合与通信问题

    react-navigation 如何判断用户是否登录跳转到登录页的方法

    React Navigation 中的登录跳转方法 React Navigation 是一个流行的移动应用程序导航解决方案,它提供了许多实用的功能来帮助开发者创建强大且易用的移动应用程序。其中,判断用户是否登录并跳转到登录页是移动...

    ios页面跳转

    在iOS应用开发中,页面跳转是用户交互的重要组成部分,它涉及到用户界面的导航和流程控制。本示例主要探讨了三种iOS页面跳转的方法:通过Storyboard进行导航、使用NavigationController以及视图转换(ViewTransition...

    Android Studio多个按钮跳转多个页面,利用选项卡功能实现

    本教程将详细介绍如何在Android Studio中实现一个功能,即通过多个按钮跳转到多个不同的页面,并利用选项卡功能来增强用户体验。首先,我们需要理解Android Studio中的布局设计、按钮事件监听以及选项卡控件的使用。...

    android+Fragment实现页面的局部跳转

    在“android+Fragment实现页面的局部跳转”这个主题中,我们将深入探讨如何利用Fragment来实现类似管理系统那样,点击左侧菜单来更新右侧内容的效果。 首先,Fragment可以看作是Activity的一部分,它可以有自己的...

    Struts2简单的页面跳转示例

    此外,Struts2还支持动态结果页面,可以使用OGNL(Object-Graph Navigation Language)表达式来决定跳转到哪个页面。例如: ```xml ${targetPage} ``` 在这里,`targetPage`变量可以在Action类中设置,它的值可以...

    谷歌插件,用于网页跳转

    5. **Chrome API**:为了实现页面跳转的记录和控制,开发者会利用Chrome提供的API,如`chrome.tabs`和`chrome.webNavigation`,它们允许插件监控和影响浏览器的行为。 6. **隐私和安全**:虽然这类插件能提供便利,...

    Mono 代码实现系统返回,跳转至上一页面

    本话题主要关注如何使用Mono来实现系统返回功能,即在用户点击设备的返回按钮时,让应用能够跳转至上一页面。 首先,我们需要了解在Mono环境中,如何监听和处理设备的返回事件。在Android平台上,通常会在Activity...

    Silverlight页面跳转及页面间传递参数

    在开发基于Silverlight的应用程序时,页面跳转和页面间参数传递是常见...通过理解以上概念和实践,开发者能够熟练地在Silverlight应用程序中进行页面跳转并实现页面间的参数传递,从而创建出更加丰富和动态的用户体验。

    Android开发课堂作业记单词APP登录注册页面跳转

    总的来说,实现"Android开发课堂作业记单词APP登录注册页面跳转"涉及了Android的基本组件使用、页面间通信、数据验证、异常处理以及用户数据存储等多个方面。掌握这些知识对于Android开发者来说至关重要,它们是构建...

    HCIA-HarmonyOS应用开发工程师 V2.0 模拟考试

    这个初级认证主要涉及HarmonyOS的基础架构、组件使用、页面跳转、权限管理、应用结构以及开发工具的使用。 1. 页面跳转分为页面内跳转和页面间跳转。页面内跳转发生在同一个Ability内部,可以通过Router或...

    HarmonyOS应用开发框架HarmonyOS应用开发-实现底部导航栏功能

    在 HarmonyOS 应用开发中,底部导航栏(Bottom Navigation)是用户界面设计的重要组成部分,它为用户提供了一种直观、便捷的方式,以便在多个主功能之间进行切换。本教程将深入探讨如何在 HarmonyOS 应用中实现底部...

    Android中页面跳转

    在Android应用开发中,页面跳转是至关重要的一个环节,它允许用户在不同的Activity之间进行切换,实现应用的功能导航。本教程将详细讲解Android中如何实现页面跳转,适合初学者学习。 首先,理解Android的基本架构...

Global site tag (gtag.js) - Google Analytics