用Vue实现页面访问拦截

这篇具有很好参考价值的文章主要介绍了用Vue实现页面访问拦截。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

用Vue实现页面访问拦截,# 前端vue入门,vue.js,javascript,前端,前端框架,开发语言

目录

页面访问拦截

1.创建axios实例 

2.添加拦截器

3.全局前置守卫

可选的第三个参数 next

总结: 


页面访问拦截

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

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

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 用Vue实现页面访问拦截,# 前端vue入门,vue.js,javascript,前端,前端框架,开发语言

你可以使用 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里面配置的路径 文章来源地址https://www.toymoban.com/news/detail-637322.html

到了这里,关于用Vue实现页面访问拦截的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端刷新页面的五种方法(含原生js、vue和react)

    1、window.history.go(0)方法 2、location.reload()方法 3、location.href=location.href方法 4、vue-router方法 5、react-router方法

    2024年02月16日
    浏览(51)
  • 【前端】vue.js从入门到项目实战笔记

    【前端目录贴】 文本插值中的代码被解释为节点的文本内容,而HTML插值中的代码则被渲染为视图节点。 3.1.1 文本插值 文本插值的方式:用 双大括号 将要绑定的变量、值、表达式括住就可以实现,Vue将会 获取计算后的值 ,并以 文本的形式 将其展示出来。 结果: 3.1.2 HTM

    2024年01月21日
    浏览(53)
  • 前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案二:轮询去判断服务端的index.html是否跟当前的index.html的脚本hash值一样

    当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 vue、js、webpack 根据打完包之后生成的 script src 的hash值去判断 ,每次打包都会生成唯一的hash值,只要轮

    2024年01月23日
    浏览(44)
  • vue、js实现页面全屏

    实测vue中可通过登录点击事件加载组件自动全屏 同理这个应该也可以实现(没有测试)

    2024年02月08日
    浏览(32)
  • 【VUE学习】权限管理系统前端vue实现3-登陆页面

             path: \\\'/login\\\' :指定了路由的路径为 \\\"/login\\\",表示该路由匹配到的 URL 是 \\\"/login\\\"。 name: \\\'login\\\' :指定了路由的名称为 \\\"login\\\",可以在代码中通过名称来进行路由导航。 component: () = import(\\\'../views/Login.vue\\\') :指定了该路由对应的组件为一个异步加载的组件。 使用箭头函

    2024年02月13日
    浏览(44)
  • 前端vue实现页面加水印文字 单个页面所有页面加水印 水印颜色

    前端vue实现页面加水印文字, 可以实现系统所有页面加水印,也可以单个页面加水印, 可更改水印颜色,  阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下:       #### 使用方法 ```使用方法 /* 给系统所有页面加水印*/ // 第一个参数:水印文字  第二个参数: 加

    2024年02月08日
    浏览(61)
  • vue下载pdf文件纯前端实现,不跳页面实现

    一、引入download.js npm install downloadjs 地址:https://www.npmjs.com/package/downloadjs 注意:使用download.js时下载的文件内容为该文件的url(url和filename参数有中文的话下载后的文件会损坏打不开,需要修改源码) 二、复制一份下载好的downloadjs 文件 , 修改后的源码

    2024年02月12日
    浏览(60)
  • vue前端实现导出页面为word(两种方法)

    注意:在当前页面引入依赖 注意:如果导出的时候出现bug,大多是因为文件路径引入有问题,再次排查路径引入

    2024年04月25日
    浏览(42)
  • 两种方法(JS方法和Vue方法)实现页面渲染

    根据数据渲染如下页面  

    2024年02月14日
    浏览(49)
  • Vue2 +Element-ui实现前端页面

    以一个简单的前端页面为例。主要是利用vue和element-ui实现。 里面涉及的主要包括:新建vue项目、一行多个输入框、页面实现等。   ①首先安装nodejs,这部分在此就不讲啦。 ②然后安装vue-cli: 查看是否安装成功: 安装成功之后就输出vue的版本 ③在cmd窗口新建一个vue2脚手架

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包