Vue项目中动态路由与权限控制:router.beforeEach的使用及无token重定向登录页

在现代前端项目中,权限控制是一个非常重要的环节。Vue Router作为Vue官方的路由管理器,为我们提供了强大的路由管理功能。在本文中,我们将探讨如何在Vue项目中使用router.beforeEach钩子函数来实现动态路由权限控制,并在用户未登录时自动重定向到登录页。

步骤一:登录并获取Token

首先,确保用户登录成功后,能够获取到token,并将token存储在Vuex或localStorage中。

// 假设登录方法
methods: {async login() {const response = await this.$http.post('/api/login', this.loginForm);const { token } = response.data;// 存储tokenthis.$store.commit('setToken', token);// 获取权限路由并动态添加this.getPermissionRoutes(token);// 登录成功后重定向到首页或其他页面this.$router.push({ path: this.$route.query.redirect || '/' });}
}

步骤二:请求后端权限路由接口

在登录方法中,或者在router.beforeEach中,如果检测到用户已经登录但没有添加权限路由,则请求后端接口获取权限路由。

// 假设的获取权限路由方法
async getPermissionRoutes(token) {const response = await this.$http.get('/api/permission_routes', {headers: {Authorization: `Bearer ${token}`}});const permissionRoutes = response.data.routes;// 动态添加路由this.addRoutes(permissionRoutes);
}

步骤三:动态添加路由

将后端返回的路由数据动态添加到路由配置中。

// 动态添加路由的方法
addRoutes(routes) {routes.forEach(route => {// 使用router.addRoute方法添加单个路由this.$router.addRoute(route);});
}

注意如果你使用的是vue2,那么你可能需要使用this.$rouer.addRoutes() 

步骤四:修改router.beforeEach

在router.beforeEach中,我们需要检查是否已经添加了权限路由,如果没有,则调用获取权限路由的方法。

router.beforeEach((to, from, next) => {// 判断是否需要登录权限if (to.matched.some(record => record.meta.requiresAuth)) {// 检查token是否存在const token = store.getters.token;if (token) {// 检查是否已经添加了权限路由if (!store.getters.isPermissionRoutesAdded) {// 获取权限路由并动态添加store.dispatch('getPermissionRoutes', token).then(() => {// 设置状态,表示权限路由已添加store.commit('setPermissionRoutesAdded', true);// 继续路由跳转next({ ...to, replace: true });}).catch(() => {// 获取权限路由失败,可以重定向到登录页或其他错误处理next('/login');});} else {next();}} else {// 没有token,重定向到登录页next({path: '/login',query: { redirect: to.fullPath }});}} else {next();}
});

步骤五:在Vuex中管理状态

在Vuex中,我们需要管理权限路由是否已经添加的状态。

// Vuex store
const store = new Vuex.Store({state: {token: null,isPermissionRoutesAdded: false},mutations: {setToken(state, token) {state.token = token;},setPermissionRoutesAdded(state, value) {state.isPermissionRoutesAdded = value;}},actions: {getPermissionRoutes({ commit, state }) {// 调用上面的getPermissionRoutes方法}},getters: {token: state => state.token,isPermissionRoutesAdded: state => state.isPermissionRoutesAdded}
});

通过以上步骤,我们就可以在Vue项目中实现由后端动态提供权限路由,并在用户没有token时重定向到登录页的功能。 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7836.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天,智能家居系统已经走进了千家万户,并逐渐成为现代生活的一部份。与此同时,一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板,已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…

人工智能:重塑未来的力量

华为OD机试 2024E卷题库疯狂收录中,刷题 点这里。 实战项目访问:http://javapub.net.cn/ 人工智能技术的未来:变革与适应 引言 随着人工智能技术的不断发展,我们已经看到了它在各行业带来的巨大变革。从医疗行业的病例诊断到企业…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式,它基于网络世界,融合了三维建模与虚拟现实技术,为消费者带来前所未有的真实、立体观车体验。以下是对3D看车的详细解释: 一、3D看车的实现方式 高精度三维建模: 通过高精度三维建模…

消息队列的测试点

消息队列的测试点 一、常用的消息队列产品1、挑战性问题 二、kafka简介三、消息的生产四、消息的存储五、Kafka的特性六、kafka测试要点 一、常用的消息队列产品 基于内存的消息队列 RabbitMQ:适用于处理高并发场景,广泛用于即时消息传递RabbitMQ&…

web实操1——只使用tomcat发布网站

安装tomcat 下载 肯定是去官网: http://tomcat.apache.org/ 下载之后,解压: !!解压后: logs日志:就是一些输出,输到文本里。 temp:一些临时文件(不用管) webapps:放网站的 work&…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第二个BOSS燥郁的毛里克

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作游戏第二个BOSS燥郁的毛里克 1.导入素材和制作相关动画1.5处理玩家受到战吼相关行为逻辑处理2.制作相应的行为控制和生命系统管理3.制作战斗场景和战斗…

HarmonyOS开发 - 餐饮APP中多门店多窗口打开实例补充

specified启动模式为指定实例模式,有一些特殊场景,例如多门店应用中每次打开一个门店都希望能新建一个门店实例,而重复打开同一个门店都是同一门店实例。 此篇为餐饮APP中多门店实例的补充内容,以解决同一门店多次点击重复创建新窗…

FreeRTOS 13:FreeRTOS队列的读原理

队列读取消息 FreeRTOS 中用于从队列中读取消息的 API 函数如下表所示: xQueueReceive BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait ) {BaseType_t xEntryTimeSet pdFALSE;TimeOut_t xTimeOut;Queue_t * con…

山东路远生态科技有限公司竣工投产仪式暨产品发布会圆满举行

第二十届三中全会于2024年7月15日至18日在北京举行。全会审议通过了《关于进一步全面深化改革、推进中国式现代化的决定》。其中提到,“要健全因地制宜发展新质生产力体制机制”。 新质生产力是由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生的当代先进生产力…

Vue + Vant Picker实现省市区三级联动

一、picker选择器的数据由columns属性控制,columns中有几个元素就代表该选择器有多少级,通过change方法来给对应列赋值 this.columns [{values: citys,className: "column1",defaultIndex: 0,flex: 1, //控制每列的宽度},{values: citys[0].…

[java][高级]FilterListenerAjax

Filter&Listener&Ajax 目标: 能够使用 Filter 完成登陆状态校验功能 能够使用 axios 发送 ajax 请求 熟悉 json 格式,并能使用 Fastjson 完成 java 对象和 json 串的相互转换 1,Filter 1.1 Filter概述 Filter 表示过滤器&#…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者,以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

java.lang.IllegalArgumentException: argument type mismatch问题排查汇总

java.lang.IllegalArgumentException: argument type mismatch 错误通常发生在方法调用时,传入的参数类型与方法签名中声明的参数类型不匹配,错误发生在堆栈跟踪中,MyBatis 反射调用方法设置 Bean 属性时。 以下是一些可能的原因和解决方法…

沉浸式学习新体验:3D虚拟展厅如何重塑教育格局!

3D虚拟展厅对于教育行业产生了深远的影响,主要体现在以下几个方面: 一、创新教学方式 3D虚拟展厅利用三维技术构建的虚拟展示空间,为教育行业带来了一种全新的教学方式。传统的教学方式往往局限于书本和课堂,而3D虚拟展厅则能够…

第107篇:国*攻防比赛中一个多层嵌套的java内存马的反混淆解密分析过程

Part1 前言 大家好,我是ABC_123。一年一度的“大型攻防比赛”已经过去2、3个月了,在此期间陆续收到了多名网友发来的内存马样本,ABC_123一直在抽时间进行分析解密工作。现在很多的内存马都进行了加密混淆,而且一个比一个复杂&…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令,添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令,添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

基于SpringBoot的“会员制医疗预约服务管理信息系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“会员制医疗预约服务管理信息系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 医院信息界面图…

从0开始linux(21)——文件(2)文件重定向

欢迎来到博主的专栏:从0开始linux 博主ID:代码小豪 文章目录 设备文件文件缓冲区重新认识文件描述符重定向 设备文件 在前一篇文章博主提到,当一个c/c进程运行时,会默认打开三个文件流,分别是stdin,stdout…

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能,允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息,特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析:用户现在可以从包含各种视觉…

【SQL server】数据库远程连接配置

SQL server远程连接配置 1、数据库远程配置1.身份验证2. 建立入站规则3. SQLServer服务的启动 1、数据库远程配置 1.身份验证 所以在安装过程中需要注意涉及到的的身份验证中,要使用混合模式,并设置密码。2. 建立入站规则 在控制面板中的防火墙管理中…