vue后台管理系统设置请求拦截器

228 阅读1分钟
import router from '@/router'
导入store
import store from '@/store'
// 导出一个axios的实例  而且这个实例要有请求拦截器 响应拦截器
import axios from 'axios'
// const service = axios.create() // 创建一个axios的实例
const service = axios.create({
  // baseURL: 'http://ihrm-java.itheima.net', // 设置axios请求的基础的基础地址
  baseURL: process.env.VUE_APP_BASE_API, // 设置axios请求的基础的基础地址
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

//===========================================================

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 如果有token就携带
    const token = store.state.user.token
    console.log('发请求,此时的token是', token)
      // 这里要根据项目中的实际文档,看一下token的头是什么样子的
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)


//===========================================================
// 响应拦截器
service.interceptors.response.use(
  response => {
    console.log('响应拦截器', response)
    if (response.data.success) {
      // 操作成功.与后端约定,操作是否成功用success来表示
      return response.data
    } else {
      // Promise.reject()  直接得到一个状态为rejected的promise对象

      return Promise.reject(new Error(response.data.message))
    }
  },
  error => {
    // do something with request error
    console.dir(error) // for debug
    if (error.response && error.response.data && error.response.data.code === 10002) {
      console.log('token失效了,当前的地址是:', router.currentRoute.fullPath)
      // token失效了
      store.dispatch('user/userLogout')

      // .vue -- this.$route.fullPath
      //  .js -- router.currentRoute.fullPath

      // 回去login页
      // 补充回跳地址
      router.push('/login?return_url=' + encodeURIComponent(router.currentRoute.fullPath))
    } else {
      return Promise.reject(error)
    }
  }
)
export default service // 导出axios实例

token中的·持久化设置

export default {
  namespaced: true,
  state: () => {
    return {
      userInfo: {},
      token: getToken() || null // 初始token
    }
  },
  mutations: {
    // 设置新token
    setToken(state, newToken) {
      // vuex
      state.token = newToken

      // 持久化
      setToken(newToken)
    },
    // 移除token
    removeToken(state) {
      // vuex
      state.token = null
      removeToken()
    },
    // 设置userInfo
    setUserInfo(state, newUserInfo) {
      state.userInfo = newUserInfo
    }
  },