使用 Vue 实现页面访问拦截
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)是基于权限的访问控制系统的核心概念。在设计鉴权逻辑时,通常需要考虑以下几个方面:
角色与权限的定义:确定系统中的角色和对应的权限,并将其进行清晰的定义和划分。
用户认证:实现用户登录验证机制,确保只有经过认证的用户才能访问受限资源。
路由权限控制:根据用户的角色和权限,在路由导航守卫中进行权限验证,决定是否允许用户访问某个页面或执行某个操作。
组件级别的权限控制:在组件内部根据用户的角色和权限,动态展示或隐藏特定功能模块或按钮。
后端接口权限控制:在后端接口层面进行权限验证,防止未经授权的请求访问敏感数据或执行重要操作。
通过合理设计和实现鉴权逻辑,可以有效地保护系统的安全性和数据的完整性。
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 项目的步骤:
首先,确保您已经安装了 Node.js 和 npm(Node 包管理器)。您可以在终端中运行以下命令来检查它们是否已安装:
node -v
npm -v
如果 Node.js 和 npm 未安装,请前往 Node.js 官网(https://nodejs.org/)下载并安装。
接下来,全局安装 Vue CLI。在终端中运行以下命令:
npm install -g @vue/cli
安装完成后,您可以使用以下命令来创建一个新的 Vue 项目:
vue create my-project
在这个命令中,my-project 是您要创建的项目名称,您可以根据实际情况进行更改。
运行上述命令后,Vue CLI 会提示您选择一些配置选项。您可以使用上下箭头键在选项之间进行选择,并使用回车键进行确认。您可以选择默认配置,或者根据需要进行自定义配置。
完成配置后,Vue CLI 会自动下载和安装项目所需的依赖项。
安装完成后,您可以使用以下命令进入项目目录:
cd my-project
最后,使用以下命令来启动开发服务器:
npm run serve
这将启动开发服务器,并在浏览器中打开项目。您可以在 http://localhost:8080(默认端口)上访问您的 Vue 应用程序。
这样,您就成功创建了一个简单的 Vue 项目。您可以根据需要在项目中添加组件、路由、状态管理等功能,并使用 Vue 的各种特性来开发您的应用程序。
4.2 配置页面访问拦截
要在 Vue 项目中添加路由守卫并进行相应的配置,可以按照以下步骤进行操作:
- 创建一个名为
auth.js
的新文件,并在其中定义一个名为AuthGuard
的路由守卫类。
import { getToken } from './auth'; // 导入获取 token 的方法
const AuthGuard = (to, from, next) => {
const token = getToken(); // 获取 token
if (token) {
// 如果存在 token,允许访问该页面
next();
} else {
// 如果不存在 token,重定向到登录页面
next('/login');
}
};
export default AuthGuard;
- 在
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 演示登录验证
要演示登录验证并验证访问拦截的效果,可以按照以下步骤进行操作:
- 在
auth.js
文件中添加一个名为login
的方法,用于模拟用户登录并保存 token。
export const login = (username, password) => {
// 模拟登录请求,验证用户名和密码
if (username === 'admin' && password === 'password') {
// 登录成功,保存 token 到 localStorage
localStorage.setItem('token', 'your_token_here');
return true;
} else {
// 登录失败
return false;
}
};
- 在
auth.js
文件中添加一个名为getToken
的方法,用于获取保存在 localStorage 中的 token。
export const getToken = () => {
return localStorage.getItem('token');
};
- 在登录页面的组件中,使用
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('登录失败,请检查用户名和密码');
}
}
}
};
- 在需要进行页面访问拦截的路由配置中,使用
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 实现页面访问拦截的更多相关文章
- axios interceptors 拦截 , 页面跳转, token 验证 Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示)
Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示) :https://blog.csdn.net/H1069495874/article/details/80057107 ...
- angularjs中的页面访问权限设置
11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangD ...
- vue单页面打包文件大?首次加载慢?按需加载?是你打开方式不对
部署各vue项目,走了一遍坑.... vue单页面应用刷新404 找到nginx多网站配置文件:类似nginx/sites-available/www.baidu.com server { liste ...
- VUE 多页面配置(二)
1. 概述 1.1 说明 项目开发过程中会遇到需要多个主页展示情况,故在vue单页面的基础上进行配置多页面开发以满足此需求,此记录为统一配置出入口. 2. 实例 2.1 页面配置 使用vue脚手架搭建 ...
- VUE 多页面配置(一)
1. 概述 1.1 说明 项目开发过程中会遇到需要多个主页展示情况,故在vue单页面的基础上进行配置多页面开发以满足此需求. 2. 实例 2.1 页面配置 2.1.1 默认首页 使用vue脚手架搭建后 ...
- asp.net 访问页面访问统计实现 for iis7
上一篇博文中< asp.net 访问页面访问统计实现 > 中在win10 (iis8+)上运行没有问题, 但客户机子是windows server 2008 的 iis7弄死不对,最好 ...
- asp.net 访问页面访问统计实现
0x00.背景: 1.用户访问网站所有页面就将访问统计数加1 ,按每月存放. 2.站点并没有用到母版面来实现,所有各个页面都很独立. 3.网站是很早这前的网站,尽量省改动以前的代码.按理说我们应该做一 ...
- `Vue`中为什么访问不了以`$`和`_`开头的属性?
Vue中为什么访问不了以$和_开头的属性? 背景:航班管家H5使用了Vue进行新版开发,预订流程逻辑copy参考了野鹅国际机票小程序,小程序中使用__开头的属性作为私有属性. 如题,在data中定义的 ...
- SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆
在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...
- vue项目页面空白
vue项目页面空白 今天新建项目,然后发现路由也改了 app.vue里面也是啥都没有, 但是访问http://localhost:8080/#/login 能访问 里面确实空白的 错误: 错误原因: ...
随机推荐
- iOS中的3种定时器
在iOS中有3种常见的定时器,它们会根据不同的场景进行选择使用. 1.DispatchSourceTimer: 基于GCD实现. 2.CADisplayLink:基于屏幕刷新实现. 3.Timer:基 ...
- 2020-11-25:go中,map的底层数据结构是什么?
福哥答案2020-11-25: 简单回答:hmap映射头.bmap桶.mapextra溢出额外信息 中级回答: // 映射头 type hmap struct { // Note: the forma ...
- 2022-02-07:k8s安装mysql,yaml如何写?(非面试题)
2022-02-07:k8s安装mysql,yaml如何写?(非面试题) 答案2022-02-07: yaml如下: apiVersion: apps/v1 kind: Deployment meta ...
- 2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值. 福大大 答案2021-08-15: 返回值=上+新-修正. 时间复杂度:O(N) 空间复杂度:O(N). 代码 ...
- python -- pandas常见的一些行、列操作方法(感兴趣的,可以跟着一起练练手)
这篇文章分享一下pandas常见的一些行.列操作方法,比较基础,感兴趣的童鞋可以看看. 首先,我们用 "random.seed(int i)" 生成一组测试数据. 对于random ...
- 2019年蓝桥杯C/C++大学B组省赛真题(特别数的和)
题目描述: 小明对数位中含有2.0.1.9 的数字很感兴趣(不包括前导0) 在1到40中这样的数包括1.2.9.10 至32.39 和40,共28 个,他们的和是574. 请问,在1到n 中,所有这样 ...
- Go 开源库运行时依赖注入框架 Dependency injection
Dependency injection 一个Go编程语言的运行依赖注入库.依赖注入是更广泛的控制反转技术的一种形式.它用于增加程序的模块化并使其具有可扩展性. 实例展示(High API): typ ...
- 现代 C++ 性能飞跃之:移动语义
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/Xd_FwT8E8Yx9Vnb64h6C8w 带给现代 C++ 性能 ...
- oracle常用函数(持续更新)
1.table() 把返回结果集合的函数返回的结果,以表的形式返回 例:table(p_split('1,2,3'),',') 2.to_char() 按照指定格式输出字符串 to_char(sysd ...
- 【电脑Tips】Win11自动更新之后开机黑屏
目录 0.问题描述 1. 释放静电 具体操作 效果 参考博客 2. 运行explorer.exe 具体操作: [问题]:如何打开任务管理器? 效果 参考博客 另外的运行方法 3. 禁用APP Read ...