1.将数据存储在Vuex中管理
export default new Vuex.Store({
state: {
// 存储token
Authorization: localStorage.getItem('Authorization') ? localStorage.getItem('Authorization') : ''
},
mutations: {
// 修改token,并将token存入localStorage
changeLogin (state, user) {
state.Authorization = user.Authorization;
localStorage.setItem('Authorization', user.Authorization);
},
// 改变用户id值,从而切换账号
changeUserId(state,userId){
state.userId = userId;
}
}
});
2.登录页中实现登录时,由服务器返回的token存储到Vuex中
login() {
....
// 提交表单时,都要预先验证
this.$refs.loginFormRef.validate(async (valid) => {
if (!valid) return;
// axios返回的是 Promise对象
this.$http
.post("/users/login", {
username: this.loginForm.username,
password: this.loginForm.password,
})
.then(
(response) => {
....
} else {
this.userToken = "Bearer " + res.token;
// 将用户token保存到vuex中
this.changeLogin({ Authorization: this.userToken });
.... }
},
(error) => {
this.$message.error(error);
}
);
});
},
3.在main.js文件中根据token的有关实现路由守卫和axios拦截
// 使用 router.beforeEach 注册一个全局前置守卫,判断用户是否登陆
router.beforeEach((to, from, next) => {
if (to.path === '/login') {
next();
} else {
let token = localStorage.getItem('Authorization');
console.log(token)
if (token === null || token === '') {
next('/login');
} else {
if (to.matched.length === 0) {
next('/404')
} else {
next();
}
}
}
});
// 添加请求拦截器,在请求头中加token
axios.interceptors.request.use(
config => {
if (localStorage.getItem('Authorization')) {
config.headers.Authorization = localStorage.getItem('Authorization');
}
return config;
},
error => {
return Promise.reject(error);
});