没有登录直接访问首页
- 将登录成功之后的 token,保存到客户端的本地存储中。如果用户没有登录,但是直接通过URL访问特定页面,需要重新导航到登录页面。
// 在配置路由的文件中配置import Vue from 'vue'import VueRouter from 'vue-router'import api from '@/api';import store from '@/store';import { MessageBox } from 'element-ui';// 路由懒加载const RegisterView = () => import('../views/register/RegisterView.vue')import addRoute from '@/utils/addRoute.js'Vue.use(VueRouter)const routes = [ // 重定向 { path: '/', redirect: '/home' }, { path: '/login', name: 'login', // 路由懒加载 component: () => import('../views/login/LoginView.vue') }, { path: '/register', name: 'register', component: RegisterView },]const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes})// 全局前置守卫router.beforeEach(async (to, from, next) => { // 进入首页时 if (to.path.includes('home')) { // 本地有 token 时 if (localStorage.token) { // 发送请求验证 token 是否有效 const res = await api.users.getInfo(); if (res && res.code) { store.commit('SET_USER_INFO', res.data); addRoute(); // 开始配置动态路由 next(); } } else { MessageBox.alert('请先登录', '提示', { confirmButtonText: '确定', callback: action => { next('/login'); } }); } } else { next(); }})export default router
已登录401
- token过期,401报错时,需要提醒用户重新登录,并跳转到登录页面
import axios from 'axios';import router from '@/router';// 公共路径axios.defaults.baseURL = 'http://47.98.128.191:3000';// 请求拦截器axios.interceptors.request.use(config => {const token = localStorage.getItem('token');if (token) { config.headers.Authorization = localStorage.getItem('token');}return config;});// 响应拦截器axios.interceptors.response.use(res => {// 处理后端返回的数据格式,将 res.data 返回给组件return res.data;}, err => {if (err && err.response && err.response.status) { if (err.response.status == 401) { localStorage.removeItem('token'); alert('登录已过期,请重新登录'); router.push('/login') return }}// 对响应错误做处理return Promise.reject(err);})