用Vue实现页面访问拦截

news2024/11/25 20:37:50

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

页面访问拦截

1.创建axios实例 

2.添加拦截器

3.全局前置守卫

可选的第三个参数 next

总结: 


页面访问拦截

目标:基于全局前置守卫,进行页面访问拦截处理
说明: 大家在做前端项目的时候,大部分页面, 游客都可以直接访问 , 如遇到 需要登录 才能进行的操作,页面将提示并跳转到登录界面
但是 对于 支付页,订单页 等,必须是登录的用户才能访问的,游客不能进入该页面, 需要做拦截处理

那么如何才能实现页面拦截并跳转到对应的登录界面呢? 

1.创建axios实例 

// 创建 axios 实例,将来对创建出来的实例,进行自定义配置
// 好处:不会污染原始的 axios 实例
import axios from 'axios'

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

2.添加拦截器

在请求或响应被 then 或 catch 处理前拦截它们。 

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

3.全局前置守卫

vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。

访问权限页面时,拦截或放行的关键点? → 用户是否有登录权证 token

你可以使用 router.beforeEach 注册一个全局前置守卫: 

const router = createRouter({ ... })

router.beforeEach((to, from) => {
  // ...
  // 返回 false 以取消导航
  return false
})

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中

每个守卫方法接收两个参数:

  • to: 即将要进入的目标 用一种标准化的方式
  • from: 当前导航正要离开的路由 用一种标准化的方式

可以返回的值如下:

  • false: 取消当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
  • 一个路由地址: 通过一个路由地址跳转到一个不同的地址,就像你调用 router.push() 一样,你可以设置诸如 replace: true 或 name: 'home' 之类的配置。当前的导航被中断,然后进行一个新的导航,就和 from 一样。 
router.beforeEach(async (to, from) => {
   if (
     // 检查用户是否已登录
     !isAuthenticated &&
     // ❗️ 避免无限重定向
     to.name !== 'Login'
   ) {
     // 将用户重定向到登录页面
     return { name: 'Login' }
   }
 })

如果遇到了意料之外的情况,可能会抛出一个 Error。这会取消导航并且调用 router.onError() 注册过的回调。

如果什么都没有,undefined 或返回 true则导航是有效的,并调用下一个导航守卫

以上所有都同 async 函数 和 Promise 工作方式一样:

router.beforeEach(async (to, from) => {
  // canUserAccess() 返回 `true` 或 `false`
  const canAccess = await canUserAccess(to)
  if (!canAccess) return '/login'
})

可选的第三个参数 next

在之前的 Vue Router 版本中,也是可以使用 第三个参数 next 的。这是一个常见的错误来源,可以通过 RFC 来消除错误。然而,它仍然是被支持的,这意味着你可以向任何导航守卫传递第三个参数。在这种情况下,确保 next 在任何给定的导航守卫中都被严格调用一次。它可以出现多于一次,但是只能在所有的逻辑路径都不重叠的情况下,否则钩子永远都不会被解析或报错。这里有一个在用户未能验证身份时重定向到/login错误用例

// BAD
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  // 如果用户未能验证身份,则 `next` 会被调用两次
  next()
})

下面是正确的版本: 

// GOOD
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  else next()
})

总结: 

全局前置导航守卫

to:   到哪里去,到哪去的完整路由信息对象 (路径,参数)

from: 从哪里来,从哪来的完整路由信息对象 (路径,参数)

next(): 是否放行

(1) next()     直接放行,放行到to要去的路径

(2) next(路径)  进行拦截,拦截到next里面配置的路径 

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

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

相关文章

JDBC概念与类的详解

JDBC 文章目录 JDBC一、概念及入门二、各个类详解1、DriverManager:驱动管理对象(1)注册驱动(2)获取数据库连接 2、Connection:数据库连接对象(1)获取执行sql的对象(2&am…

碎片拼接恢复XenServer虚拟机中SQLServer数据库的数据恢复案例

服务器数据恢复环境: 某单位一台Dell服务器上使用RAID卡搭建了一组由4盘RAID10。 服务器安装的XenServer虚拟化操作系统,虚拟机采用的Windows Server操作系统。 共系统盘和数据盘两个虚拟机磁盘,上层部署的是Web服务器(ASP SQLSe…

实施高级存储功能

实施高级存储功能 使用Stratis管理分层存储 Stratis 适用于Linux的本地存储管理解决方案。旨在提供更便利的方式执行存储的初始配置,对存储配置进行修改,并使用高级存储功能。 Stratis以管理物理存储设备池的服务形式运行,并透明地为新创…

基于机器视觉和倾角传感器的位姿检测系统及验证

悬臂式掘进机位姿检测是综掘工作面自动化的基础和前提。只有获取稳定可靠的掘进机实时位姿,才能够在此基础上进行综掘工作面自动化、智能化改造工作。 为了提高井下综掘工作面的生产效率,西安电子科技大学机电工程学院的研究团队提出一种基于机器视觉和…

[免费在线] 将 PDF 转换为 Excel 或 Excel 转换为 PDF | 5 工具

有了免费的在线 PDF 转换器,您可以轻松免费在线将 PDF 转换为 Excel 或 Excel 转换为 PDF。这篇文章为您筛选了 5 个最常用的工具。要从存储介质恢复错误删除或丢失的 PDF 文档、Excel 电子表格、Word 文件或任何其他文件,您可以使用免费的数据恢复程序 …

力扣62.不同路径(动态规划)

/*** 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。* 问总共有多少条不同的路径? *…

【生物医学】应激(应激反应)全身适应综合征

最近在探索疲劳、负荷、应激方面的底层发生机制,遂整理了一些相关内容,以脑图方式呈现。本文以生物医学向为主。 OK,开始基础介绍:应激 (stress)是指在收到外部或内部、心理社会刺激下的非特异性适应反应。 本文主要收集整理了相…

BLIP2

BLIP2的任务是基于已有的固定参数的图像encoder和语言大模型(LLM)搭建一个具有图像理解能力的图文模型,输入是图像和文本,输出是文本。 BLIP2基于Q-Former结构,如下图所示。Q-Former包含图像transformer和文本transfo…

Unity之ShaderGraph 节点介绍 UV节点

UV节点 Flipbook(翻页或纹理帧动画) Polar Coordinates(将输入 UV 的值转换为极坐标。) Radial Shear(径向剪切变形) Rotate(将UV 的值旋转) Spherize(鱼眼镜头的球形变…

3天爆肝整理,自动化测试-YAML文件读写实战(超细总结)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 YAML 简介 YAML&…

Python 调用自定义函数

新手入坑。 通常我们需要把公共函数提出来,作为公共资源调用。也避免了代码的重复书写。 比如我们在项目内创建我们的py脚本路径如下: 在公共方法中定义方法: class CommonMethods:def dataFormat(df):dataList []for row in range(0, df.…

中国信通院腾讯安全发布《2023数据安全治理与实践白皮书》

导读 腾讯科技(深圳)有限公司和中国信息通信研究院云计算与大数据研究所共同编制了本报告。本报告提出了覆盖组织保障、管理流程、技术体系的以风险为核心的数据安全治理体系,并选取了云场景、互娱、社交等场景,介绍相应场景下数据安全治理实践路线及主…

如何实现对主机的立体监控?

主机监控是保证系统稳定性和性能的重要环节之一,那应该如何实现对主机的立体监控? 本期EasyOps产品使用最佳实践,我们将为您揭晓: 主机应该如何分组和管理? 主机监控应该关注哪些关键性指标? 背 景 通…

web自动化测试 —— pytest快速上手

1. pytest pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: 简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(p…

7.1.tensorRT高级(2)-使用openvino进行onnx的模型推理过程

目录 前言1. openvino2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-使用 openvino 进行 onnx…

微信小程序云开发快速入门(4/4)

前言 上一章节《微信小程序云开发快速入门(3/4)》 我们在之前的分享中学习到了,云存储和云数据库,接下来我们来学习下云函数。 云函数 云函数相当于服务器接口的概念,它并属于小程序端代码。它是以函数的形式运行后…

新手班主任如何快速完成分班查询系统制作?

作为一个新手班主任,要快速完成分班查询系统的创建工作,可以按照以下步骤进行: 1. 确定需求:首先要明确分班查询系统所需的功能和要求。与学校领导和其他老师进行沟通,了解他们对系统的期望和需求,包括查询…

了解以太网通信中的九阳神功 - SOME/IP协议

智能座舱SOME/IP通信 概述SOME/IP基础协议SOME/IP SD协议通信行为流程开机流程关机行为行为时序总结概述 SOME/IP协议是目前国内座舱SOA化应用比较广泛的一种ECU或车辆网络内设备之间交换数据的网络通信协议。它允许不同车辆组件,如发动机控制单元、信息娱乐系统、车身控制模…

数学类问题(Leetcode)

1.质数数量 nullhttps://leetcode.cn/problems/count-primes/description/解题思路&#xff1a; 遍历大于1 且小于n的每个数的倍数&#xff0c;设置为非质数&#xff0c;剩下的就都是质数了。 代码&#xff1a; class Solution { public:int countPrimes(int n) {if(n<2)…

第一章-JavaScript基础进阶part5:移动端网页特效

文章目录 一、触屏事件-touch1.1 常见touch事件1.2 触屏事件对象&#xff08;TouchEvent&#xff09;1.3 移动端拖动元素 二、移动端常见特效2.1 click延时解决方案 三、移动端常用开发插件3.1 fastclick.js 解决移动端点击事件300ms延迟问题3.2 Swiper插件的使用 一、触屏事件…