【vue】如何搭建拦截器和设置路由守卫(基于token认证)

项目开发的时候没有使用已有的框架,自己搭建了一个,所以拦截器和路由守卫也要自己搭建

步骤
第一步:在src根目录下新建http.js文件,设置请求拦截器和路由守卫

在这里插入图片描述

http.js文件内容

import axios from 'axios';
import router from './router';
import {setCookie,getCookie} from "@/cookie.js"
import store from './store'

// axios 配置
axios.defaults.timeout = 8000;
axios.defaults.baseURL = global.BASE_URL;


// http request 拦截器
axios.interceptors.request.use(
  config => {
    if(config.url =="http://192.168.22.52:8081/auth-web/access/login"){
      return config;
    }else{
      if (store.state.Authorization) { //判断token是否存在
        config.headers.Authorization =getCookie();  //将token设置成请求头
      }
      return config;
    }
    
  },
  err => {
    return Promise.reject(err);
  }
);

// http response 拦截器
axios.interceptors.response.use(
  response => {
    if (response.data.errno === 999) {
      router.replace('/');
      console.log("token过期");
    }
    return response;
  },
  error => {
    return Promise.reject(error);
  }
);

/**
 * 请求失败后的错误统一处理
 * @param {Number} status 请求失败的状态码
 */
const errorHandle = (status, other) => {
  // 状态码判断
  switch (status) {
      // 401: 未登录状态,跳转登录页
      case 401:
          toLogin();
          break;
      // 404请求不存在
      case 404:
          message.error('请求的资源不存在',5);
          break;
      default:
          console.log(other);
  }};



// //路由守卫
router.beforeEach((to, from, next)  => {
  if(from.name == "Login"){ // 如果不需要权限校验,直接进入路由界面
    next();
  }else if(to.meta.requireAuth){
    // 判断该路由是否需要登录权限
    if (store.state.Authorization) {  // 获取当前的token是否存在
      console.log("token存在");
      next();
    } else {
      console.log("token不存在");
      next({
        path: '/login', // 将跳转的路由path作为参数,登录成功后跳转到该路由
        query: {redirect: to.fullPath}
      })
    }
  }else { // 如果不需要权限校验,直接进入路由界面
    next();
  }
});

export default axios;


第二步:在src根目录下新建store文件夹和Index.js文件

å¨è¿éæå¥å¾çæè¿°

首先安装vuex

npm install vuex --save



Index.js文件内容

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
//  const a=123;
const store = 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);
    }
  }
});
 
export default store;



第三步:在src根目录下新建cookie.js文件

function setCookie(token){
    document.cookie = token;
}
function getCookie(){
    return document.cookie;
}
export{setCookie,getCookie}


第四步:在main.js中引入store和http.js

//增加拦截器
import http from './http';  //此处问http文件的路径
Vue.prototype.$http = http;
//引入store
import store from './store'

new Vue({
  el: '#app',
  store,//增加store
  router,
  components: { App },
  template: '<App/>'
})


第五步:在组件中使用
登陆中在缓存储存token

setCookie(res.data.data.token); // 将获取的token存入cookie.js
localStorage.setItem("Authorization", res.data.data.token);
store.state.Authorization=res.data.data.token;

 原文链接:https://blog.csdn.net/yujing1314/article/details/101679653

Vue2中,可以使用路由导航守卫来判断token。在路由配置中,可以使用beforeEach导航守卫来进行判断。该导航守卫接收三个参数:to表示将要访问的页面,from表示从哪个路径跳转而来,next是一个表示放行的函数。在导航守卫的回调函数中,可以通过从sessionStorage中获取保存的token值来进行判断。如果没有token,则可以强制跳转到登录页,否则放行,即验证成功。以下是一个示例代码: ```javascript // 挂载路由导航守卫 router.beforeEach((to, from, next) => { // 如果访问的是登录页,直接放行 if (to.path === '/login') return next(); // 获取token const tokenStr = window.sessionStorage.getItem('token'); // 如果没有获取到token,则跳转到登录页 if (!tokenStr) return next('/login'); // 有token则放行 next(); }); ``` 这段代码的作用是,在用户访问非登录页时,会先判断是否存在token。如果不存在token,则会强制跳转到登录页;如果存在token,则放行,即验证成功。这样可以实现路由拦截器判断token的功能。 #### 引用[.reference_title] - *1* *3* [Vue——token原理、路由导航守卫与请求拦截器](https://blog.csdn.net/weixin_43599321/article/details/128603623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [在vue中使用token认证方法设置路由导航守卫实现路由拦截](https://blog.csdn.net/weixin_44229941/article/details/125311995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值