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

 更新时间:2024年11月18日 09:33:50   作者:龙儿筝  
文章介绍了一种使用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就行了。

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

到此这篇关于鸿蒙Navigation拦截器实现页面跳转登录鉴权方案的文章就介绍到这了,更多相关鸿蒙Navigation拦截器页面跳转登录鉴权内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信小程序(微信应用号)开发工具0.9版安装详细教程

    微信小程序(微信应用号)开发工具0.9版安装详细教程

    这篇文章主要介绍了微信小程序(微信应用号)开发工具0.9版安装详细教程的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 科普:多线程与异步的区别

    科普:多线程与异步的区别

    这篇文章主要介绍了科普:多线程与异步的区别,本文讲解了多线程和异步操作的异同、异步操作的本质、线程的本质、异步操作的优缺点、多线程的优缺点等内容,需要的朋友可以参考下
    2015-06-06
  • vscode中launch.json和task.json配置教程(重要参数详解)

    vscode中launch.json和task.json配置教程(重要参数详解)

    这篇文章主要给大家介绍了关于vscode中launch.json和task.json配置(重要参数详解)的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • 基于chatgpt的微信自动回复功能实现

    基于chatgpt的微信自动回复功能实现

    这篇文章主要介绍了基于chatgpt的微信自动回复功能实现,微信自动回复基于聊天api的实现代码,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 比较经典技术普及帖 以你刚才在淘宝上买了一件东西

    比较经典技术普及帖 以你刚才在淘宝上买了一件东西

    你发现快要过年了,于是想给你的女朋友买一件毛衣,你打开了taobao。这时你的浏览器首先查询DNS服务器,将taobao转换成ip地址
    2012-06-06
  • 如何本地部署DeepSeek

    如何本地部署DeepSeek

    这篇文章介绍了如何在本地部署DeepSeek大型语言模型,并分享了遇到的问题和解决方法,感兴趣的朋友一起看看吧
    2025-02-02
  • JSON常用的几种注释代码示例

    JSON常用的几种注释代码示例

    JSON是一种轻量级的数据交换格式,下面这篇文章主要给大家介绍了关于JSON常用的几种注释,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • Scala项目构建工具sbt和IntelliJ IDEA环境配置详解

    Scala项目构建工具sbt和IntelliJ IDEA环境配置详解

    这篇文章主要介绍了Scala项目构建工具sbt和IntelliJ IDEA环境配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • MobaXterm的安装和使用及问题小结

    MobaXterm的安装和使用及问题小结

    MobaXterm是一款全能的终端连接工具,支持SSH连接,支持FTP、串口等协议。接下来通过本文给大家分享MobaXterm的安装和使用及遇到的问题解决方法,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 卷积神经网络Inception V3网络结构图

    卷积神经网络Inception V3网络结构图

    这篇文章主要为大家介绍了卷积神经网络的网络结构图Inception V3的结构图层详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论