当前位置: 首页 > article >正文

React 封装高阶组件 做路由权限控制

路由权限控制做什么?

主要就是判断用户是否登陆,只有登陆获取到有效的token,才能跳转到页面。

思路:

判断是否有 token ,如果有 token 则返回正常的组件,如果没有 token 则跳转到登陆页。

实现:

因为是ts所以先定义参数类型,这里的ReactElement代表的是一个 React 元素例如:<div/> 或者是组件。之后我们获取到 token ,通过 token 的有无判断跳转到相应页面。

代码:

封装高阶组件:

interface AuthRouteProps {
  children: React.ReactElement;
}

export function AuthRoute({ children }: AuthRouteProps) {
  const token = getToken();
  if (token) {
    return <>{children}</>;
  } else {
    // 使用 Navigate 组件进行导航
    message.error("请先登录");
    return <Navigate to="/login" />;
  }
}

在路由配置文件中,引入封装的组件,例如:

children: [
      {
        index: true,
        element: <Chat />
      },
      {
        path: '/paint',
        element: (
          <AuthRoute><Paint /></AuthRoute>
        )
      },
      {
        path: '/me',
        element: <div>我的</div>
      }
    ]

缺点:

目前只是通过判断 token 有无,如果 token 失效了却还是会跳转,如果是跳转到的页面需要携带token 则可以在响应拦截器中进行处理:token 会发给后端,后端通过解密后来判断用户是否存在

// 添加响应拦截器
request.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data;
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    if(error.status === 401){
      removeToken()
      router.navigate('/login')
      window.location.reload()
    }
    return Promise.reject(error);
  }
);

如果只是单纯的跳转页面的话要进行改造也是发一个请求给后端,后端通过处理返回给前端 token 是否有效:

export async function AuthRoute({children}){
  const token = getToken();
  // 模拟请求发给后端token
  const res = await getUserInfo({ token });

  if (res.data.code) {
    return <>{children}</>;
  } else {
    return <Navigate to="/login" replace />;
  }
}

所以要通过具体的业务来处理用户登陆和 token 是否有效。

比较:

通过这样的方式写和直接在访问页面中判断token有什么区别?

直接在访问页面时判断:这种方式通常是在页面组件加载或渲染时进行的,即在用户已经导航到该页面后才进行检查。

使用AuthRoute组件:判断是在路由跳转之前进行的。当用户尝试访问受保护的路由时,AuthRoute组件会首先检查token,然后决定是否允许访问或进行重定向。


http://www.kler.cn/a/522715.html

相关文章:

  • Vscode的AI插件 —— Cline
  • 从替代到覆盖:暴雨信创服务器打开市场新局面
  • [MySQL]事务的理论、属性与常见操作
  • C++17 std::variant 详解:概念、用法和实现细节
  • C语言基础3
  • electron typescript运行并设置eslint检测
  • 梯度下降优化算法-Adam
  • 【无标题】规范学生的课堂行为。
  • 指针的介绍2后
  • 【Rust自学】15.7. 循环引用导致内存泄漏
  • Spring AOP原理
  • 智能门锁开发系列:从设计到实现的全面解析
  • Mybaties缓存机制
  • 装饰SpringMVC的适配器实现响应自动包装
  • 每日一题 429. N 叉树的层序遍历
  • WebPages 表单:设计与实现指南
  • react-bn-面试
  • 使用国内镜像加速器解决 Docker Hub 拉取镜像慢或被屏蔽的问题
  • 学习第七十六行
  • 备份与恢复管理系统深度解析及代码实践
  • GitHub 仓库的 Archived 功能详解:中英双语
  • 炫酷JavaScript文本时钟
  • 跨平台物联网漏洞挖掘算法评估框架设计与实现项目后期研究方案
  • 008 mybatis缓存
  • 全志 视频输入组件的使用
  • 强化学习在自动驾驶中的实现与挑战