(十八)实现一个完整的前后端请求登录的过程前端逻辑(axios+process+Vue-ls)


1:配置自适应(开发,生产)环境的全局变量

在根目录下面创建两个文件.env.development ,.env.production

(1).env.development 开发环境

NODE_ENV=development
VUE_APP_AXIOS_BASEURL=http://localhost:43597/
VUE_APP_AXIOS_API=/api

(2).env.production 生产环境

NODE_ENV=production
VUE_APP_AXIOS_BASEURL=http://xxxx:43597/
VUE_APP_AXIOS_API=/api

2:在main.js里面引用axios,并且对axios对象进行初始化

import Axios from "axios"; Axios.defaults.timeout = 100000//设置超时时间 Axios.defaults.baseURL = process.env.VUE_APP_AXIOS_BASEURL+ process.env.VUE_APP_AXIOS_API //设置axios的baseUrl Axios.defaults.withCredentials = true //允许跨域携带cookie信息 app.prototype.$Http = Axios //设置全局的$Http    3:在main.js里面引用并且挂着vue-ls(用了做缓存) import Storage from 'vue-ls'; const app=createApp(App); const options = {   namespace: 'vuejs__', // key键前缀   name: 'ls', // 命名Vue变量.[ls]或this.[$ls],   storage: 'local', // 存储名称: session, local, memory }; app.use(Storage, options); app.prototype.appls=app.ls;//配置全局的app.ls,方便其他任意地方使用   4:调用登录接口,将登录后放的结果存放到vue-ls里面  this.appls.set('Access-Token','wert')//假如wert就是后端登录成功后返回的token   5:在main.js开启axios请求的全局拦截器,让每一个请求都携带一个token(可以在其他js里面写,然后在main.js里面import那个js) Axios.interceptors.request.use(   config => {     var token=this.appls.get('Access-Token');     if(token){     config.headers.Authorization =token;     }       return config;   },   err => {       return Promise.reject(err);   });    6:在main.js开启axios响应的全局拦截器,让axios每次响应都会去执行(可以在其他js里面写,然后在main.js里面import那个js) (1):响应全局拦截器设置 service.interceptors.response.use((response) => {  checkResponse(response)   return response.data }, err) (2):检查token是否快要过期,如果在快要过期的时候,就好重新刷新token function checkResponse (res) {   // 刷新token   if (!res.headers) {       if (res.getResponseHeader('pms_exp') === '1') {         refreshToken(res)       }   } else if (res.headers.pms_exp === '1') {     refreshToken(res)   } } (3):token刷新 function refreshToken (response) {   const config = response.config   return service.post('/Sys_User/replaceToken').then(res => {     if (res.status) {       Vue.ls.set(ACCESS_TOKEN, 'Bearer ' + res.data, 7 * 24 * 60 * 60 * 1000)//缓存有效时间是7天       config.headers['Authorization'] = 'Bearer ' + res.data //重新给axios的header赋新的token值       config.baseURL = process.env.VUE_APP_API_BASE_URL //给axios设置基路径        // 已经刷新了token,将所有队列中的请求进行重试        return service(config)     } else {       store.dispatch('Logout').then(() => {                 setTimeout(() => {                   window.location.reload()                 }, 1500)               })     }   }) }