Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制

在Vue 3中,导航守卫(Navigation Guard)用于拦截路由的变化,可以在用户访问页面前进行检查。结合Axios进行token认证机制时,我们可以通过导航守卫在路由跳转时,检查用户的认证状态,确保用户有有效的token进行认证。

下面,我将通过具体代码示例,逐步讲解如何实现这一功能:

文章目录

      • 1. 安装必要的依赖
      • 2. 创建 `axios` 实例
      • 3. 在 `router.js` 中使用导航守卫
      • 4. 处理登录与登出逻辑
      • 5. 使用场景
      • 6. 总结

1. 安装必要的依赖

首先,确保你已经安装了 axios,这是我们用来发起 HTTP 请求的库。

npm install axios

2. 创建 axios 实例

我们通常会创建一个封装了token认证逻辑的 axios 实例,便于管理所有请求。

// src/utils/axios.js
import axios from 'axios';const instance = axios.create({baseURL: 'https://api.example.com', // 设置基本的 API 地址timeout: 5000, // 设置请求超时
});// 请求拦截器
instance.interceptors.request.use(config => {const token = localStorage.getItem('token'); // 从localStorage获取tokenif (token) {config.headers['Authorization'] = `Bearer ${token}`; // 在请求头中加入token}return config;
}, error => {return Promise.reject(error);
});// 响应拦截器
instance.interceptors.response.use(response => {return response;
}, error => {if (error.response.status === 401) {// 如果响应返回 401,表示未授权,可以跳转到登录页面window.location.href = '/login';}return Promise.reject(error);
});export default instance;

3. 在 router.js 中使用导航守卫

接下来,在 router.js 中配置路由的导航守卫,检查每次路由跳转前的用户认证状态。

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import axios from '../utils/axios'; // 导入axios实例
import Home from '../views/Home.vue';
import Login from '../views/Login.vue';const routes = [{path: '/',name: 'Home',component: Home,meta: { requiresAuth: true }, // 需要认证的页面},{path: '/login',name: 'Login',component: Login,},
];const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes,
});// 全局前置守卫
router.beforeEach(async (to, from, next) => {const token = localStorage.getItem('token');if (to.meta.requiresAuth) {if (!token) {// 如果目标路由需要认证且没有token,跳转到登录页return next({ name: 'Login' });}try {// 如果有token,验证token是否有效const response = await axios.get('/verify-token'); // 假设后端提供了验证token的接口if (response.status === 200) {next(); // token有效,允许继续访问}} catch (error) {// token无效或请求失败,跳转到登录页localStorage.removeItem('token'); // 清除无效tokennext({ name: 'Login' });}} else {next(); // 不需要认证的页面,直接访问}
});export default router;

4. 处理登录与登出逻辑

在用户登录时,我们会获取token并将其存储在 localStorage 中;登出时,我们需要清除token。

// src/views/Login.vue
<template><div><h1>Login</h1><form @submit.prevent="handleLogin"><input v-model="username" placeholder="Username" /><input v-model="password" type="password" placeholder="Password" /><button type="submit">Login</button></form></div>
</template><script>
import axios from '../utils/axios';export default {data() {return {username: '',password: '',};},methods: {async handleLogin() {try {const response = await axios.post('/login', {username: this.username,password: this.password,});const token = response.data.token;localStorage.setItem('token', token); // 保存tokenthis.$router.push('/'); // 登录成功后跳转到首页} catch (error) {console.error('Login failed:', error);}},},
};
</script>
// src/views/Home.vue
<template><div><h1>Welcome Home</h1><button @click="handleLogout">Logout</button></div>
</template><script>
export default {methods: {handleLogout() {localStorage.removeItem('token'); // 清除tokenthis.$router.push('/login'); // 跳转到登录页},},
};
</script>

5. 使用场景

这个 token 认证机制可以应用于任何需要用户登录的页面。例如,用户在访问需要身份认证的页面(如首页)时,首先会触发导航守卫,在守卫中验证 token 是否有效。如果没有有效的 token,用户会被重定向到登录页面。

场景总结:

  • 首页 (/): 需要 token 来验证用户身份。导航守卫检查 token 是否存在并有效。
  • 登录页 (/login): 用户输入用户名和密码后,向后端发送请求,获取并存储 token。
  • 全局登出: 用户登出时,清除 token 并跳转到登录页。

6. 总结

通过上述步骤,我们已经实现了:

  1. 使用 axios 进行 token 的请求头设置与认证。
  2. 在 Vue 3 的路由中使用导航守卫拦截认证逻辑。
  3. 在登录时保存 token,并在用户访问需要认证的页面时检查 token 是否有效。

这种认证机制可以有效地保证用户在访问敏感页面时,必须通过认证,而不会直接跳过认证过程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5使用favicon.ico图标

目录 1. 使用favicon.ico图标 1. 使用favicon.ico图标 favicon.ico一般用于作为网站标志&#xff0c;它显示在浏览器的地址栏或者标签上 制作favicon图标 选择一个png转ico的在线网站&#xff0c;这里以https://www.bitbug.net/为例。上传图片&#xff0c;目标尺寸选择48x48&a…

Langchain+文心一言调用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中国国庆日是哪一天?") print(…

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…

java常量池

目录 1 Class常量池 2 运行时常量池 3 字符串常量池 3.1 为什么要设计字符串常量池 3.2 字符串对象三种创建姿势 3.3 字符串的操作 3.4 字符串的不可变性 4 包装类型常量池 1 Class常量池 class 文件的资源仓库javap命令可以查看class常量池 主要包含字面量和符号引用字面量 由…

ES6语法

一、Let、const、var变量定义 1.let 声明的变量有严格局部作用域 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

windows平台通过命令行安装前端开发环境

访问node.js官网 访问node.js官网https://nodejs.org/en/download/&#xff0c;可以看到类似画面&#xff1a; 可以获取以下命令 # Download and install fnm: winget install Schniz.fnm # Download and install Node.js: fnm install 22 # Verify the Node.js version: no…

【2025小年源码免费送】

&#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜&#xff0c; &#x1f525;码农福利等你领&#xff01; &#x1f496;山高路远坑又深&#xff0c; &#x1f4d5;大军纵横任驰奔&#xff0c; &#x1f389;谁敢横刀立马行…

深入 Flutter 和 Compose 的 PlatformView 实现对比,它们是如何接入平台控件

在上一篇《深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比》发布之后&#xff0c;收到了大佬的“催稿”&#xff0c;想了解下 Flutter 和 Compose 在 PlatformView 实现上的对比&#xff0c;恰好过去写过不少 Flutter 上对于 PlatformView 的实现&#xff0c;这次恰好…

小游戏源码开发搭建技术栈和服务器配置流程

近些年各种场景小游戏开发搭建版本层出不穷,山东布谷科技拥有多年海内外小游戏源码开发经验&#xff0c;现为从事小游戏源码开发或游戏运营的朋友们详细介绍小游戏开发及服务器配置流程。 一、可以对接到app的小游戏是如何开发的 1、小游戏源码开发的需求分析&#xff1a; 明…

【Linux网络编程】传输层协议

目录 一&#xff0c;传输层的介绍 二&#xff0c;UDP协议 2-1&#xff0c;UDP的特点 2-2&#xff0c;UDP协议端格式 三&#xff0c;TCP协议 3-1&#xff0c;TCP报文格式 3-2&#xff0c;TCP三次握手 3-3&#xff0c;TCP四次挥手 3-4&#xff0c;滑动窗口 3-5&#xf…

五、华为 RSTP

RSTP&#xff08;Rapid Spanning Tree Protocol&#xff0c;快速生成树协议&#xff09;是 STP 的优化版本&#xff0c;能实现网络拓扑的快速收敛。 一、RSTP 原理 快速收敛机制&#xff1a;RSTP 通过引入边缘端口、P/A&#xff08;Proposal/Agreement&#xff09;机制等&…

期权帮|在股指期货中超过持仓限额怎么办?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 在股指期货中超过持仓限额怎么办&#xff1f; 一、立即平仓或减仓&#xff1a; &#xff08;1&#xff09;最直接且有效的方法是立即平仓或减仓&#xff0c;以降低持仓量至限额…

【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )

文章目录 一、Tag Body 数据块体结构 - Video Data 视频数据1、Vedio Data 视频数据 类型标识2、Vedio Data 视频数据 结构分析3、Composition Time Offset 字段涉及的时间计算4、AVC Packet Type 字段说明① AVC Sequence Header 类型② AVC NALU 类型③ AVC End of Sequence …

【React】 react路由

这一篇文章的重点在于将React关于路由的问题都给搞清楚。 一个路由就是一个映射关系&#xff0c;key:value。key是路径&#xff0c;value 可能是function或者component。 安装react-router-dom包使用路由服务&#xff0c;我这里想要用的是6版本的包&#xff0c;因此后面加”6&q…

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…

Git代码管理工具 — 5 GitHub远程仓库

目录 1 常用的代码托管平台 2 GitHub平台详解 2.1 github简介 2.2 Github基本功能介绍 3 GitHub创建远程仓库 3.1 创建远程仓库 3.2 创建远程仓库别名 4 推送本地分支到远程仓库 5 拉取远程库到本地 6 克隆远程库到本地 1 常用的代码托管平台 前面我们已经知道了Git…

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…

mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。

在第一章中安装 &#xff0c;启动mysql80 服务后&#xff0c;连接上了mysql&#xff0c;那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前&#xff0c;要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…

10个非常基础的 Javascript 问题

Javascript是一种用于Web开发的编程语言。JavaScript在网络的客户端上运行。 根据MDN&#xff0c;JavaScript&#xff08;通常缩写为JS&#xff09;是一种轻量级的&#xff0c;解释性的&#xff0c;面向对象的语言&#xff0c;具有一流的功能&#xff0c;并且最著名的是Web页面…