uniapp無痛刷新token

用戶登陸拿到token,但因爲token是有時限的,刷新token的時候須要無聲無息,用戶還能繼續以前的請求。api

這裏個人想法是,當token到期,返回狀態碼401,就發起刷新token接口,拿到新的token就把以前的請求再發送一遍,暫時解決問題服務器

此法適用uniapp噢,以前看到其餘人的教程,而後按照他的作法,本身親測以後並記錄網絡

  1. 首先,引入封裝的request插件:https://ext.dcloud.net.cn/plugin?id=159
  2. 按照插件配置服務器網址。
  3. 在index.js中設置請求攔截程序
import http from './interface' import store from "@/store/index.js"
/** * 將業務全部接口統一塊兒來便於維護 * 若是項目很大能夠將 url 獨立成文件,接口分紅不一樣的模塊 */ module.exports={ api: { userDetail:'/user', //用戶詳情
        //... }, request:(url,data,method) => { http.config.baseUrl = ""
    //設置請求前攔截器
    http.interceptor.request = (config) => { let token =uni.getStorageSync("token") delete config.header['Authorization'] if(token){ config.header['Authorization']='Bearer ' +token } } //設置請求結束後攔截器
    http.interceptor.response =async (response) => { const statusCode=response.statusCode if(statusCode ===401){ //返回401,即token需刷新 return    response.data=await doRequest(response,url) } if (statusCode === 422){ uni.hideLoading()   //業務代碼...return } 
   // 不能再刷新時,服務器返回狀態碼500時,判斷是否是刷新token的接口
if(response.statusCode ===500 ){

        if(response.config.url.indexOf("current") == -1){
            uni.showToast({
              icon:"none",
              title:"網絡錯誤"
            })
        }




app

        return } if(response.statusCode===200 || response.statusCode===201|| response.statusCode===204){ //成功 uni.hideLoading() return response.data }else { uni.hideLoading() uni.showToast({ title:response.data.message , icon:'none', duration: 1000 }) return } } return http.request({ url:url, data, method:method }) }, }
//刷新token並繼續以前請求
async function doRequest(response,url){ const res=await module.exports.request('/authorizations/current',{},'PUT') if(res && res.access_token){ let config=response.config uni.setStorageSync("token", res.access_token); config.header['Authorization']='Bearer '+res.access_token const resold=await module.exports.request(url,{...config.data},config.method) uni.hideLoading() return resold }


       else{         //這個時候狀態碼是 500 console.log("從新登錄"); uni.removeStorageSync("token") store.commit("login",undefined) uni.removeStorageSync("password") uni.showToast({ title:"身份信息過時,請從新登錄", duration: 1000, success() { uni.reLaunch({ url:'/pages/login/login' }) } }) return false } }

 

 // 統一的響應日誌記錄 interface.js中,將401開放出來,500開放
 _reslog(response) if (statusCode === 200 || statusCode === 401 || statusCode === 201 || statusCode === 204|| statusCode === 500 ) { //成功  
            resolve(response);
          }

else {             reject(response)          }
相關文章
相關標籤/搜索