• vue请求封装


    import Vue from 'vue'
    import axios from 'axios'
    import router from '@/router'
    import qs from 'qs'
    import merge from 'lodash/merge'
    import {clearLoginInfo, routeToLogin} from '@/utils'
    import store from '@/store'
    
    const http = axios.create({
      timeout: 1000 * 30,
      withCredentials: true,
      headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'client': 'PC'
      }
    })
    
    const refreshTokenHttp = axios.create({
      timeout: 1000 * 30,
      withCredentials: true,
      headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'client': 'PC',
      }
    })
    
    /**
     * 请求拦截
     */
    http.interceptors.request.use(config => {
      config.headers['token'] = Vue.cookie.get('token') // 请求头带上token
      return config
    }, error => {
      return Promise.reject(error)
    })
    /**
     * 响应拦截
     */
    http.interceptors.response.use(async response => {
      if (response.data && response.data.code === 401) { // 401, token失效
        let refreshToken = Vue.cookie.get('refreshToken')
        if (refreshToken) {
          const refreshTokenResult = await refreshTokenHttp({
            url: http.adornUrl(`/sys/refresh-token`),
            method: "post",
            params: {
              'refreshToken': Vue.cookie.get('refreshToken')
            }
          })
          const refreshTokenData = refreshTokenResult.data
          const rememberPassword = Boolean(localStorage.getItem('rememberPassword'))
          const domainName = store.state.common.domainName
          const adminDomainName = store.state.common.adminDomainName
    
          if (refreshTokenData && refreshTokenData.code === 200) {
            let expireHours = 720 //默认为30天
            if(rememberPassword && rememberPassword === false){
              expireHours = 16
            }
            Vue.cookie.set("token", refreshTokenData.token,'8h');
            Vue.cookie.set("refreshToken", refreshTokenData.refreshToken,expireHours + 'h');
    
            // 将新的Token设置到axios的默认请求头
            http.defaults.headers['token'] = refreshTokenData.token;
    
            // 将新的Token设置到重发的请求头
            response.config.headers.token = refreshTokenData.token;
    
            // 请求重发
            const responseFn = await http.request(response.config)
            return responseFn;
          } else {
            clearLoginInfo()
            routeToLogin()
          }
        }else {
          clearLoginInfo()
          routeToLogin()
        }
      }
      return response
    }, error => {
      return Promise.reject(error)
    })
    
    /**
     * 请求地址处理
     * @param {*} actionName action方法名称
     */
    http.adornUrl = (actionName) => {
      // 非生产环境 && 开启代理, 接口前缀统一使用[/proxyApi/]前缀做代理拦截!
      return (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : window.SITE_CONFIG.baseUrl) + actionName
    }
    
    /**
     * get请求参数处理
     * @param {*} params 参数对象
     * @param {*} openDefultParams 是否开启默认参数?
     */
    http.adornParams = (params = {}, openDefultParams = true) => {
      var defaults = {
        't': new Date().getTime()
      }
      return openDefultParams ? merge(defaults, params) : params
    }
    
    /**
     * post请求数据处理
     * @param {*} data 数据对象
     * @param {*} openDefultdata 是否开启默认数据?
     * @param {*} contentType 数据格式
     *  json: 'application/json; charset=utf-8'
     *  form: 'application/x-www-form-urlencoded; charset=utf-8'
     */
    http.adornData = (data = {}, openDefultdata = true, contentType = 'json') => {
      var defaults = {
        't': new Date().getTime()
      }
      data = openDefultdata ? merge(defaults, data) : data
      return contentType === 'json' ? JSON.stringify(data) : qs.stringify(data)
    }
    
    export default http
    /**
     * 清除登录信息
     */
    export function clearLoginInfo () {
      Vue.cookie.delete('token')
      Vue.cookie.delete('refreshToken')
      store.commit('resetStore')
      router.options.isAddDynamicMenuRoutes = false
    }
    /***
     * 重定向到登录页面
     */
    export function routeToLogin() {
      router.push({name: buildLoginPage()})
    }
    /***
     * 根据域名获取登录页面
     */
    export function buildLoginPage() {
      const domainName = store.state.common.domainName
      const adminDomainName = store.state.common.adminDomainName
    
      if (window.location.href.indexOf(domainName) != -1) {
        return 'OutletsedLogin'
      } else {
        return 'login-admin'
      }
    }
  • 相关阅读:
    起名
    用超级巡警批量清除被挂马的网页
    我在csdn回复的帖子
    多线程与socket编程
    NET面试汇总
    第5 章: Windows Message Mapping 20080111 09:04 207人阅读 评论(0) 收藏
    oo的开始 分类: VC++ 20071228 14:31 176人阅读 评论(0) 收藏
    Cstring 截获数据 20080110 11:22 234人阅读 评论(0) 收藏
    截取字符串 20080110 08:18 188人阅读 评论(0) 收藏
    CString DOWRD互转 20080110 08:26 378人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/onlywu/p/14154127.html
Copyright © 2020-2023  润新知