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

使用 Vue 实现页面访问拦截

使用 Vue 实现页面访问拦截

在现代的 Web 应用程序中,页面访问拦截是非常重要的一个方面。它可以用于确保用户只能访问他们有权限的页面,提高应用程序的安全性和用户体验。本篇博文将介绍如何使用 Vue 框架来实现页面访问拦截的功能。

文章目录

  • 使用 Vue 实现页面访问拦截
  • 1 Vue 路由与导航守卫
    • 1.1 Vue 路由简介
    • 1.2 导航守卫概述
  • 2 实现访问拦截的核心概念
    • 2.1 路由守卫介绍
      • 2.1.1 前置守卫(`beforeEach`)
      • 2.1.2 后置钩子(`afterEach`)
      • 2.1.3 解析守卫(`beforeResolve`)
    • 2.2 鉴权逻辑设计
    • 2.3 登录验证机制
  • 3 实现页面访问拦截的步骤
    • 3.1 路由配置
    • 3.2 守卫函数编写
    • 3.3 拦截处理
  • 4 示例演示
    • 4.1 创建 Vue 项目
    • 4.2 配置页面访问拦截
    • 4.3 演示登录验证
  • 5 总结

1 Vue 路由与导航守卫

1.1 Vue 路由简介

Vue 路由是用于构建单页应用程序(SPA)的官方路由库。它允许开发者根据不同的 URL 地址,将页面切换到对应的组件上,实现页面之间的无刷新跳转。

在 Vue 路由中,我们可以定义一组路由规则,每个路由规则都映射一个 URL 地址和对应的组件。当用户访问某个 URL 地址时,路由会根据配置的规则找到匹配的组件,并将其渲染到指定的位置。

Vue 路由提供了多种导航方式,包括普通的链接跳转、编程式导航以及通过浏览器前进和后退按钮进行导航等。

1.2 导航守卫概述

导航守卫是 Vue 路由提供的一种功能,用于在路由切换过程中进行控制和管理。它可以让开发者在路由切换前、切换后或者切换取消时执行一些特定的逻辑操作。

导航守卫主要有以下几个钩子函数:

  • beforeEach: 在每次路由切换前被调用,可以用来进行全局的权限验证或其他前置操作。
  • afterEach: 在每次路由切换后被调用,可以用来进行统计或其他后置操作。
  • beforeResolve: 在每次路由切换前被调用,与beforeEach类似,但在全局 afterEach 调用之前被调用。
  • beforeEnter: 在单个路由配置中定义的钩子函数,在进入该路由前被调用。

此外,还有两种特殊的导航守卫:

  • beforeRouteUpdate: 在当前路由复用时调用,比如从 /user/1 导航到 /user/2
  • beforeRouteLeave: 在离开当前路由前调用,可以用来提示用户保存未保存的数据。

通过使用导航守卫,我们可以实现诸如登录验证、权限控制、页面跳转拦截等功能。

2 实现访问拦截的核心概念

2.1 路由守卫介绍

2.1.1 前置守卫(beforeEach

前置守卫是在路由切换前被调用的钩子函数。可以通过注册全局前置守卫或者在单个路由配置中定义的 beforeEnter 钩子来实现。

使用前置守卫可以进行一些全局的权限验证或其他前置操作,例如检查用户是否登录、校验用户权限等。如果需要阻止当前导航,则可以调用 next(false)

2.1.2 后置钩子(afterEach

后置钩子是在路由切换后被调用的钩子函数。它没有能力改变导航本身,只能做一些统计或其他后置操作。

后置钩子不接收 next 函数参数,因为无法改变导航。

2.1.3 解析守卫(beforeResolve

解析守卫是在路由组件准备就绪之前被调用的钩子函数。它类似于全局前置守卫,但在全局 afterEach 调用之前被调用。

解析守卫可以用来处理异步路由组件的加载过程,确保在渲染组件之前获取到必要的数据。

2.2 鉴权逻辑设计

鉴权(Authorization)是基于权限的访问控制系统的核心概念。在设计鉴权逻辑时,通常需要考虑以下几个方面:

  1. 角色与权限的定义:确定系统中的角色和对应的权限,并将其进行清晰的定义和划分。

  2. 用户认证:实现用户登录验证机制,确保只有经过认证的用户才能访问受限资源。

  3. 路由权限控制:根据用户的角色和权限,在路由导航守卫中进行权限验证,决定是否允许用户访问某个页面或执行某个操作。

  4. 组件级别的权限控制:在组件内部根据用户的角色和权限,动态展示或隐藏特定功能模块或按钮。

  5. 后端接口权限控制:在后端接口层面进行权限验证,防止未经授权的请求访问敏感数据或执行重要操作。

通过合理设计和实现鉴权逻辑,可以有效地保护系统的安全性和数据的完整性。

2.3 登录验证机制

利用 Vue 路由导航守卫可以很方便地实现用户登录验证机制。

首先,在全局前置守卫(beforeEach)中检查用户是否已登录。如果用户未登录,则可以使用 next('/login') 将用户重定向到登录页面。

router.beforeEach((to, from, next) => {const isLoggedIn = checkUserLoggedIn(); // 检查用户是否已登录if (to.meta.requiresAuth && !isLoggedIn) {next('/login'); // 重定向到登录页面} else {next(); // 继续导航}
});

在需要进行登录验证的路由配置中,可以通过 meta 字段指定该路由需要进行权限验证。

const routes = [{path: '/dashboard',component: Dashboard,meta: { requiresAuth: true } // 需要登录验证},// 其他路由配置...
];

这样,在用户访问 /dashboard 路径时,会先触发全局前置守卫进行登录验证。如果用户未登录,则会被重定向到登录页面;如果用户已登录,则会继续导航到目标页面。

通过以上方式,我们可以很方便地实现基于 Vue 路由导航守卫的用户登录验证机制。

3 实现页面访问拦截的步骤

3.1 路由配置

在 Vue 路由中,通过设置路由守卫规则来实现页面访问拦截。可以在需要拦截的页面配置相应的守卫。

首先,在项目的路由文件(通常是 router.js)中引入 Vue Router,并创建一个新的 Router 实例。

import Vue from 'vue'
import VueRouter from 'vue-router'Vue.use(VueRouter)const router = new VueRouter({routes: [// 路由配置信息]
})

然后,在路由配置中为需要拦截的页面添加守卫。

const router = new VueRouter({routes: [{path: '/login',component: Login},{path: '/dashboard',component: Dashboard,meta: { requiresAuth: true } // 添加 requiresAuth 元字段表示需要登录验证}]
})

在上面的代码中,'/dashboard’路径的组件 Dashboard 需要进行登录验证。

3.2 守卫函数编写

接下来,编写前置守卫函数,用于实现登录验证和权限校验的逻辑。

router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isAuthenticated()) {next('/login') // 如果需要登录验证且未登录,则跳转到登录页面} else {next() // 否则继续导航}
})function isAuthenticated() {// 进行登录验证的逻辑,返回 true 表示已登录,false 表示未登录
}

在上面的代码中,beforeEach 函数是全局前置守卫,会在每次路由切换前执行。我们可以在其中进行登录验证的逻辑判断。

如果 to.meta.requiresAuth 为 true 且用户未登录(isAuthenticated()返回 false),则通过 next(‘/login’)跳转到登录页面。否则,调用 next()继续导航到目标页面。

3.3 拦截处理

最后,在拦截处理部分,根据需要拦截的情况,进行相应的跳转或提示。

在上述代码中,当需要登录验证且用户未登录时,会通过 next(‘/login’)将用户重定向到登录页面。

你还可以根据具体需求进行其他拦截处理,比如权限校验、访问限制等。

这样,就完成了基本的页面访问拦截实现。

4 示例演示

4.1 创建 Vue 项目

要创建一个简单的 Vue 项目,您可以使用 Vue CLI(命令行界面)来快速搭建项目结构。以下是使用 Vue CLI 创建 Vue 项目的步骤:

  1. 首先,确保您已经安装了 Node.js 和 npm(Node 包管理器)。您可以在终端中运行以下命令来检查它们是否已安装:

    node -v
    npm -v
    
  2. 如果 Node.js 和 npm 未安装,请前往 Node.js 官网(https://nodejs.org/)下载并安装。

  3. 接下来,全局安装 Vue CLI。在终端中运行以下命令:

    npm install -g @vue/cli
    
  4. 安装完成后,您可以使用以下命令来创建一个新的 Vue 项目:

    vue create my-project
    

    在这个命令中,my-project 是您要创建的项目名称,您可以根据实际情况进行更改。

  5. 运行上述命令后,Vue CLI 会提示您选择一些配置选项。您可以使用上下箭头键在选项之间进行选择,并使用回车键进行确认。您可以选择默认配置,或者根据需要进行自定义配置。

  6. 完成配置后,Vue CLI 会自动下载和安装项目所需的依赖项。

  7. 安装完成后,您可以使用以下命令进入项目目录:

    cd my-project
    
  8. 最后,使用以下命令来启动开发服务器:

    npm run serve
    

    这将启动开发服务器,并在浏览器中打开项目。您可以在 http://localhost:8080(默认端口)上访问您的 Vue 应用程序。

这样,您就成功创建了一个简单的 Vue 项目。您可以根据需要在项目中添加组件、路由、状态管理等功能,并使用 Vue 的各种特性来开发您的应用程序。

4.2 配置页面访问拦截

要在 Vue 项目中添加路由守卫并进行相应的配置,可以按照以下步骤进行操作:

  1. 创建一个名为auth.js的新文件,并在其中定义一个名为AuthGuard的路由守卫类。
import { getToken } from './auth'; // 导入获取 token 的方法const AuthGuard = (to, from, next) => {const token = getToken(); // 获取 tokenif (token) {// 如果存在 token,允许访问该页面next();} else {// 如果不存在 token,重定向到登录页面next('/login');}
};export default AuthGuard;
  1. router/index.js文件中导入AuthGuard类,并将其添加到需要进行页面访问拦截的路由配置中。
import AuthGuard from '@/auth';const routes = [{path: '/dashboard',component: DashboardComponent,beforeEnter: AuthGuard // 使用 beforeEnter 属性指定路由守卫},{path: '/profile',component: ProfileComponent,beforeEnter: AuthGuard},...
];const router = new VueRouter({routes
});export default router;

在上述示例中,AuthGuard路由守卫将会拦截对/dashboard/profile路径的访问,只有在存在 token 的情况下才允许访问这些页面。如果不存在 token,则会被重定向到登录页面。

4.3 演示登录验证

要演示登录验证并验证访问拦截的效果,可以按照以下步骤进行操作:

  1. auth.js文件中添加一个名为login的方法,用于模拟用户登录并保存 token。
export const login = (username, password) => {// 模拟登录请求,验证用户名和密码if (username === 'admin' && password === 'password') {// 登录成功,保存 token 到 localStoragelocalStorage.setItem('token', 'your_token_here');return true;} else {// 登录失败return false;}
};
  1. auth.js文件中添加一个名为getToken的方法,用于获取保存在 localStorage 中的 token。
export const getToken = () => {return localStorage.getItem('token');
};
  1. 在登录页面的组件中,使用login方法进行用户登录,并根据登录结果进行相应的处理。
import { login } from '@/auth';export default {data() {return {username: '',password: ''};},methods: {handleLogin() {const { username, password } = this;const loggedIn = login(username, password);if (loggedIn) {// 登录成功,跳转到首页或其他需要登录的页面this.$router.push('/dashboard');} else {// 登录失败,显示错误提示alert('登录失败,请检查用户名和密码');}}}
};
  1. 在需要进行页面访问拦截的路由配置中,使用beforeEnter属性指定路由守卫。
import AuthGuard from '@/auth';const routes = [{path: '/dashboard',component: DashboardComponent,beforeEnter: AuthGuard},{path: '/profile',component: ProfileComponent,beforeEnter: AuthGuard},...
];

在上述示例中,login方法模拟用户登录,并将 token 保存在 localStorage 中。在登录页面的组件中,调用login方法进行登录,并根据登录结果进行相应的处理。在需要进行页面访问拦截的路由配置中,使用beforeEnter属性指定路由守卫。

5 总结

在这篇技术博客中,我们学习了如何使用 Vue 实现页面访问拦截。页面访问拦截是一种常见的安全措施,可以确保只有经过身份验证的用户才能访问特定页面或执行特定操作。

通过 Vue 的导航守卫功能,我们可以在路由切换之前进行拦截,并根据需要进行身份验证或权限检查。通过使用 beforeEach 导航守卫,我们可以在每次路由切换之前执行自定义逻辑。

在这篇博客中,我们演示了如何创建一个简单的登录页面,并使用导航守卫来阻止未经身份验证的用户访问受保护的页面。我们还介绍了如何使用 Vue 的路由功能来设置路由和导航守卫。

通过这个示例,我们可以看到 Vue 的灵活性和强大性,使我们能够轻松地实现页面访问拦截功能。这对于构建安全的 Web 应用程序至关重要。

希望这篇博客对您有所帮助,并为您提供了使用 Vue 实现页面访问拦截的基础知识。如果您对此感兴趣,可以进一步探索 Vue 的其他功能和扩展,以提升您的开发技能和构建更安全的应用程序。

相关文章:

使用 Vue 实现页面访问拦截

使用 Vue 实现页面访问拦截 在现代的 Web 应用程序中,页面访问拦截是非常重要的一个方面。它可以用于确保用户只能访问他们有权限的页面,提高应用程序的安全性和用户体验。本篇博文将介绍如何使用 Vue 框架来实现页面访问拦截的功能。 文章目录 使用 Vu…...

使用webpack建立React+TS项目

之前写过类似的文章,这次看到一本新书里也介绍了这个知识点,故尝试之。 Refer: 《Learn React With TypeScript - A Beginners Guide To Reactive Web Development With React 18 and TypeScript》chapter3 Creating a project with webpack 1.先建立一…...

法律监督大数据平台有什么作用?

大数据赋能时代法律监督,构建法律行业领域大数据监督模型。法律监督大数据研判系统助力检察机关以社会公正为核心价值追求,对执法不严、司法不公“零容忍”,强化对诉讼活动的法律监督,坚决维护法律尊严,坚决捍卫公平正…...

根据制定的长度切割list值

88、根据制定的长度切割list值 依赖&#xff0c;谷歌开源的工具类库&#xff0c;非常的强大 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version> </dependency>其…...

AES加密(1):AES基础知识和计算过程

从产品代码的安全角度考虑&#xff0c;我们需要对代码、数据进行加密。加密的算法有很多种&#xff0c;基于速度考虑&#xff0c;我们一般使用对称加密算法&#xff0c;其中有一种常见的对称加密算法&#xff1a;AES(Advanced Encryption Standard)。在一些高端的MCU&#xff0…...

Nginx启动报错- Failed to start The nginx HTTP and reverse proxy server

根据日志&#xff0c;仍然出现 “bind() to 0.0.0.0:8888 failed (13: Permission denied)” 错误。这意味着 Nginx 仍然无法绑定到 8888 端口&#xff0c;即使使用 root 权限。 请执行以下操作来进一步排查问题&#xff1a; 确保没有其他进程占用 8888 端口&#xff1a;使用以…...

五、web应用程序技术——web功能

文章目录 一、服务器端功能1.1 SQL1.2 XML1.3 web服务 二、客户端功能2.1 HTML2.2 超链接2.3 表单2.4 CSS2.5 JavaScript2.6 文档对象模型2.7 Ajax2.8 JSON2.9 同源策略2.10浏览器拓展技术 一、服务器端功能 早期的web站点由各种静态资源组成&#xff0c;如HTML页面与图片。当用…...

AutoDL服务器的镜像版本太高,配置python3.7 tensorflow1.15版本的框架的步骤

1.选择一个实例&#xff0c;进入后端界面 2. 更新bashrc中的环境变量 conda init bash && source /root/.bashrc查看虚拟环境 conda info --envs可以看到此时有一个base的虚拟环境 但是它的python版本为3.8.10&#xff0c;无法安装tensorflow1.15,所以我们要创建一个…...

c++ boost库之scoped_ptr,shared_ptr,weak_ptr智能指针

头文件: #include <boost/smart_ptr.hpp> #include <boost/make_shared.hpp> #include <boost/shared_ptr.hpp> 1. scoped_ptr & scoped_array 只能在本作用域内使用,不希望被转让; 效率等同原始指针; scoped_ptr<string> sp(new string("t…...

【leetcode】383. 赎金信(easy)

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 class Solution {public boolea…...

CTF-记一次PWN练习

PWN是一个黑客语法的俚语词&#xff0c;自"own"这个字引申出来的&#xff0c;这个词的含意在于&#xff0c;玩家在整个游戏对战中处在胜利的优势&#xff0c;或是说明竞争对手处在完全惨败的情形下&#xff0c;这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个…...

《golang设计模式》第一部分·创建型模式-04-工厂方法模式(Factory Method)

文章目录 1 概述2.1 角色2.2 类图 2 代码示例2. 1 设计2.2 代码2.3 类图 3. 简单工厂3.1 角色3.2 类图3.3 代码示例3.3.1 设计3.3.2 代码3.3.3 类图 1 概述 工厂方法类定义产品对象创建接口&#xff0c;但由子类实现具体产品对象的创建。 2.1 角色 Product&#xff08;抽象产…...

redis的配置和使用、redis的数据结构以及缓存遇见的常见问题

目录 1.缓存 2.redis不仅仅可以做缓存&#xff0c;只不过说他的大部分场景&#xff0c;是做缓存。本地缓存重启后缓存里的东西就没有了&#xff0c;但是redis有。 3.redis有几个特性:查询快&#xff0c;但是是放到内存里的〈断电或者重启&#xff0c;数据就丢了)&#xff0c…...

在Ubuntu系统下修改limits.conf不生效

文章目录 前言尝试过程总结 前言 最近遇到的一个问题&#xff0c;在Ubuntu系统下修改/etc/security/limits.conf不生效&#xff0c;查了多种资料都说不用重启&#xff0c;但是我改完就是不生效&#xff0c;多次尝试之后发现Ubuntu系统有毒。 尝试过程 通过 ulimit -n 命令可…...

selenium 选项 chrome_options

当前环境&#xff1a; Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 &#xff08;64 位&#xff09; 一种方法&#xff1a; from selenium import webdriverif __name__ __main__:# chrome 选项配置chrome_options webdriver.ChromeOptions(…...

自然语言处理(Natural Language Processing,NLP)

自然语言处理(Natural Language Processing&#xff0c;NLP)是人工智能领域的一个重要分支&#xff0c;旨在使计算机能够理解、处理和生成人类自然语言。NLP 的目标是让计算机能够像人类一样有效地理解和交流&#xff0c;从而实现更自然、更智能的人机交互。 NLP的理解概括&…...

基于机器学习的库存需求预测 -- 机器学习项目基础篇(12)

在本文中&#xff0c;我们将尝试实现一个机器学习模型&#xff0c;该模型可以预测在不同商店销售的不同产品的库存量。 导入库和数据集 Python库使我们可以轻松地处理数据&#xff0c;并通过一行代码执行典型和复杂的任务。 Pandas -此库有助于以2D阵列格式加载数据帧&#…...

【D3S】集成smart-doc并同步配置到Torna

目录 一、引言二、maven插件三、smart-doc.json配置四、smart-doc-maven-plugin相关命令五、推送文档到Torna六、通过Maven Profile简化构建 一、引言 D3S&#xff08;DDD with SpringBoot&#xff09;为本作者使用DDD过程中开发的框架&#xff0c;目前已可公开查看源码&#…...

网络安全设备及部署

什么是等保定级&#xff1f; 之前了解了下等保定级&#xff0c;接下里做更加深入的探讨 文章目录 一、网路安全大事件1.1 震网病毒1.2 海康威视弱口令1.3 物联网Mirai病毒1.4 专网 黑天安 事件1.5 乌克兰停电1.6 委内瑞拉电网1.7 棱镜门事件1.8 熊猫烧香 二、法律法规解读三、安…...

LVS集群

目录 1、lvs简介&#xff1a; 2、lvs架构图&#xff1a; 3、 lvs的工作模式&#xff1a; 1&#xff09; VS/NAT&#xff1a; 即&#xff08;Virtual Server via Network Address Translation&#xff09; 2&#xff09;VS/TUN &#xff1a;即&#xff08;Virtual Server v…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...