登录与路由拦截
介绍
导航拦截用于统一处理需要登录的页面,避免在每个页面重复校验登录状态。拦截配置集中在 core/navigation/src/main/ets/RouteInterceptor.ts。
受保护路由配置
将需要登录的路由名加入 PROTECTED_ROUTES。如果某个页面需要登录才能访问,就把它的路由常量写在这里。
ts
import { AuthRoutes } from "./auth/AuthRoutes";
import { UserRoutes } from "./user/UserRoutes";
/**
* @file 路由拦截配置(登录校验)
*/
const PROTECTED_ROUTES = [
// 用户信息页面
UserRoutes.Profile
// 其他需要登录的页面...
] as const;
export type ProtectedRouteName = typeof PROTECTED_ROUTES[number];
const loginRequiredRouteNames: Set<ProtectedRouteName> = new Set<ProtectedRouteName>(PROTECTED_ROUTES);
/**
* 判断路由是否需要登录
* @param {string} routeName - 路由名称
* @returns {boolean} 是否需要登录
*/
export function requiresLogin(routeName: string): boolean {
return loginRequiredRouteNames.has(routeName as ProtectedRouteName);
}
/**
* 获取登录页路由名称
* @returns {ProtectedRouteName} 登录页路由
*/
export function getLoginRoute(): ProtectedRouteName {
return AuthRoutes.Login as ProtectedRouteName;
}登录页配置
登录页路由在 getLoginRoute() 中配置。如果项目的登录页不是 AuthRoutes.Login,只需要在这里替换成你自己的登录路由。
ts
/**
* 获取登录页路由名称
* @returns {ProtectedRouteName} 登录页路由
*/
export function getLoginRoute(): ProtectedRouteName {
return AuthRoutes.Login as ProtectedRouteName;
}拦截逻辑说明
NavigationService.navigateTo()内部会调用requiresLogin()。- 未登录时自动跳转到登录页,不需要业务层手动判断。
- 登录页路由更换时,只需要调整
getLoginRoute()。
常见调整
- 新增受保护页面:在
PROTECTED_ROUTES中添加路由名。 - 登录页改名:在
getLoginRoute()中替换为新的路由常量。