HarmonyOS鸿蒙Next中使用HMRouter时如何最简单实现页面拦截

HarmonyOS鸿蒙Next中使用HMRouter时如何最简单实现页面拦截 就是有的页面需要登录才可以进,但是每个页面都加一遍判断登录状态的代码感觉很麻烦,那我问你!!有没有什么办法可以一下子搞定呢??

3 回复

有的!兄弟有的!!

你只需要写个下面的全局拦截器,后续只需要维护需要增加登录验证的页面标识,不需要去页面本身做任何事就能自动实现拦截逻辑。

完整代码:

/**
 * @文件名称: LoginCheckInterceptor.ets
 * @作者: 魔眼天王
 * @创建时间: 2025/10/17 16:07
 * @描述: 登陆拦截
 */
@HMInterceptor({
  interceptorName: 'LoginCheckInterceptor',
  priority: 2,
  global: true
})
export class LoginCheckInterceptor implements IHMInterceptor {
  handle(info: HMInterceptorInfo): HMInterceptorAction {
    console.info("LoginCheckInterceptor--> targetName: " + info.targetName)
    switch (info.targetName) {
      case PageConstant.COLLECT_LIST_PAGE://添加需要拦截未登录的页面标识
      case PageConstant.HISTORY_LIST_PAGE:
      case PageConstant.ORDER_AND_HISTORY_DIALOG:
        const isLogin = LoginManager.getInstance().getIsLogin()
        if (isLogin) {//判断登录状态
          return HMInterceptorAction.DO_NEXT
        } else {
          HMRouterMgr.request(ServiceConstant.CHECK_IS_LOGIN)
          return HMInterceptorAction.DO_REJECT;
        }
      default:
        return HMInterceptorAction.DO_NEXT
    }
  }
}

更多关于HarmonyOS鸿蒙Next中使用HMRouter时如何最简单实现页面拦截的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中使用HMRouter实现页面拦截,最简单的方式是通过实现IRouteInterceptor接口。在onIntercept方法中编写拦截逻辑,判断是否满足拦截条件。若满足,可调用callback.onInterrupt()终止路由;否则调用callback.onContinue()放行。最后,在初始化Router时,通过addInterceptor()方法将拦截器实例添加到路由器中即可生效。

在HarmonyOS Next中使用HMRouter实现全局页面拦截,最简洁高效的方式是通过路由拦截器(Interceptor)。你无需在每个页面单独编写判断逻辑,只需在应用启动时全局配置一次即可。

具体步骤如下:

  1. 实现拦截器:创建一个类并实现RouterInterceptor接口,在onIntercept方法中编写你的拦截逻辑(例如检查登录状态)。
import { RouterInterceptor, RouterInfo } from '@ohos/router';

export class AuthInterceptor implements RouterInterceptor {
  onIntercept(routerInfo: RouterInfo): boolean {
    // 1. 定义需要登录的页面路径白名单
    const needAuthPages = ['/pageA', '/pageB', '/profile'];
    
    // 2. 检查目标页面是否需要拦截
    if (needAuthPages.includes(routerInfo.url)) {
      // 3. 检查登录状态(这里假设你有全局的登录状态管理)
      const isLoggedIn = AppStorage.get('isLogin') || false;
      
      if (!isLoggedIn) {
        // 4. 未登录则跳转到登录页,并拦截原跳转
        router.pushUrl({ url: 'pages/Login' });
        return true; // 返回true表示拦截本次路由
      }
    }
    
    // 5. 放行不需要拦截的页面
    return false;
  }
}
  1. 注册拦截器:在应用入口(如EntryAbility)中全局注册:
import { Router } from '@ohos/router';

// 在Ability的onCreate生命周期中注册
Router.addInterceptor(new AuthInterceptor());
  1. 登录状态管理:建议使用AppStorage或全局状态管理来维护登录状态,登录成功后更新状态:
// 登录成功后
AppStorage.setOrCreate('isLogin', true);

关键优势

  • 一次配置全局生效:所有需要登录的页面统一管理
  • 灵活的白名单机制:可精确控制哪些页面需要拦截
  • 非侵入式设计:页面组件无需任何修改
  • 符合HarmonyOS路由规范:使用官方推荐的标准方式

注意事项

  • 拦截器返回true表示拦截路由,返回false表示放行
  • 登录页本身不应添加到拦截白名单,避免循环跳转
  • 路由路径需与实际页面路径完全匹配

这种方式将登录验证逻辑从业务页面中完全解耦,实现了关注点分离,后续维护只需修改拦截器中的白名单即可。

回到顶部