Vue 项目中用户登录及 token 验证的思路
创始人
2024-01-29 00:04:26
0

vue-router 导航守卫
所谓“导航”,即路由正在发生变化。可在路由跳转时完成一些操作,而 router.beforeEach() 全局前置守卫可以在路由跳转前对现在状态进行校验,例如验证用户的登录状态,若未登录则可以有效进行拦截。

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...
})

axios 拦截器
axios 拦截器又分为请求拦截器与响应拦截器,可在请求或响应被 then 或 catch 处理前拦截它们,即在前端页面向后端发送请求时触发进行拦截。

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

如果你稍后需要移除拦截器,可以这样:

const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

区别
导航守卫更像是路由级拦截,而 axios 拦截器则是接口级拦截,这是它们本质上的区别。

关于它们更详细的区分在后文会提及,这里先不讨论,因为知识点没有带入到实例场景中进行应用容易造成理解不深或理解不了的问题,先回归正文。

Vue 项目实现 token 验证

401 Unauthorized:该状态码表示用户所发送的请求没有访问权限,需要进行身份认证。返回含有 401 的响应必须包含一个适用于被请求资源的 WWW-Authenticate 首部用以质询用户信息。

前后端分离开发方式固然好,但也带来了一些棘手的问题,如跨域处理、token 验证…

接下来展开说说 token 验证。

在 Vue 项目中实现 token 验证的大致思路如下:

第一次登录时,前端调用后端的登录接口,发送用户名和密码
后端收到请求后,验证用户名和密码的合法性,成功则给前端返回一个 token
前端拿到 token 后,将其存储到 localStorage 和 vuex 中,并跳转路由页面
此后前端每次跳转路由时,就判断 localStorage 中有无 token,没有则跳转到登录页面,有则跳转到对应的路由页面
且前端每次调用后端接口时,都要在请求头中携带 token
后端判断请求头中有无 token
header 中存在 token:验证 token 的合法性,成功则返回前端请求的数据;失败(如 token 过期)就返回 401 状态码(401 Unauthorized)
header 中不存在 token:同样返回 401 状态码
如果前端接收到 401 状态码,则清除 token 信息并跳转到登陆页面
Login.vue


store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)const store = new Vuex.Store({state: {// 存储tokenAuthorization: localStorage.getItem('Authorization') ? localStorage.getItem('Authorization') : ''},mutations: {// 修改token,并将token存入localStoragechangeLogin (state, user) {state.Authorization = user.Authorization;localStorage.setItem('Authorization', user.Authorization);}}
});export default store

router/index.js: 导航守卫

import Vue from 'vue';
import Router from 'vue-router';
import login from '@/components/login';
import home from '@/components/home';Vue.use(Router);const router = new Router({routes: [{path: '/',redirect: '/login'},{path: '/login',name: 'login',component: login},{path: '/home',name: 'home',component: home}]
});// 导航守卫:使用 router.beforeEach 注册一个全局前置守卫,判断用户是否登陆
router.beforeEach((to, from, next) => {if (to.path === '/login') {next();} else {let token = localStorage.getItem('Authorization');if (token === null || token === '') {next('/login');} else {next();}}
});export default router

请求拦截器

// 请求拦截器, 每次请求都会在请求头中携带token
axios.interceptors.request.use((config) => {if(localStorage.getItem('Authorization')) {config.headers.Authorization = localStorage.getItem('Authorization')}return config;
}, (error) => {return Promise.reject(error);
})

401 Unauthorized 处理
如果前端拿到后端返回的 401 状态码,则清除 token 信息并跳转到登陆页面。

localStorage.removeItem('Authorization');
this.$router.push('/login');

导航守卫 与 请求拦截器
导航守卫仅仅简单判断是否有 token 值存在(不管该 token 是否有效),如果不存在/失效就进行重定向。

请求拦截器是向后端发送请求并校验,如果 token 合法就访问成功,否则访问失败并进行重定向。

⭐总之,在进行页面权限判断时通常都是让 vue-router 导航守卫和 axios 拦截器搭配使用!

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...