中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

uniapp無痛刷新token的方法介紹

發布時間:2021-06-04 16:22:43 來源:億速云 閱讀:842 作者:栢白 欄目:開發技術

本篇文章和大家了解一下uniapp無痛刷新token的方法介紹。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

前端在請求接口時,和后端定義好了,如果狀態碼為 401 ,則表明 token 過期,需要前端請求新的 token

大概流程如下:

1.用戶登錄之后,后端會返回兩個 token ,分別為accessToken 和refreshToken 存儲到Storage

平時請求數據時,請求頭使用accessToken 來發送接口

2.當返回401 token 過期后, 我們通過接口向后端獲取新的 token ,請求參數為refreshToken

3.我們拿到新的accessToken 和refreshToken 之后, 替換掉之前的Storage 中存儲的 token

4.同時還要將我們報 401 的哪個接口 ,使用新的accessToken ,重新請求一次, 拿到數據,實現無痛刷新 token

5.如果后端返回的新的 token 也無法使用,表明需要重新登錄,跳到登錄頁(這一步可以靈活使用,我個人用的是一個路由插件配合使用的: https://ext.dcloud.net.cn/plugin?id=578)

配合uni-app的插件進行使用和實現:

到uni-app的插件市場下載封裝的request網絡請求,按照文檔配置到自己的項目上

地址:https://ext.dcloud.net.cn/plugin?id=159

配置好后修改vmeitime-http 文件夾下的 index.js 文件

uniapp無痛刷新token的方法介紹

uniapp無痛刷新token的方法介紹

再修改vmeitime-http 文件夾下的 interface.js 文件,將401狀態暴漏出來

uniapp無痛刷新token的方法介紹

如果看到這里還是看不明白,那么請看我的源碼,請注意我使用了兩個插件,觀眾們酌情理解,仔細消化,配合到自己的項目中思考...

import http from './interface'
import config from './config'

// request.js
import Vue from 'vue'
import Router  from '@/router'

//...其它邏輯代碼

export const execute = (name, data = {}) => {

    //設置請求前攔截器
    http.interceptor.request = (config) => {
        let token = uni.getStorageSync('accessToken')
        delete config.header['x-access-token']
        if (token) {
            config.header['x-access-token'] = token
        }
    }
    //設置請求結束后攔截器
    http.interceptor.response = async (response) => {
        const statusCode = response.statusCode;
        if (statusCode === 401) {
            response = await doRequest(response)
        }
        if (statusCode === 402) {
            uni.removeStorageSync('accessToken');
            uni.removeStorageSync('refreshToken');
            uni.removeStorageSync('realname');
            let jump = uni.getStorageSync('jump')
            if (!jump) {
                setTimeout(() => {
                    uni.showModal({
                        title: '提示',
                        content: '您的賬號在其它地點登錄!',
                        showCancel: false,
                        success: function(res) {
                            if (res.confirm) {
                                Router.push({
                                    name: 'login',
                                    params: {
                                        'RouterName': 'home'
                                    }
                                })
                            }
                        },
                    })
                });
                uni.setStorageSync('jump', 'true')
            }
        }
        if (statusCode == 403) {
            let jump = uni.getStorageSync('jump')
            if (!jump) {
                setTimeout(() => {
                    Router.replace({
                        name: 'login',
                        params: {
                            'RouterName': 'home'
                        }
                    })
                },500)
                uni.setStorageSync('jump', 'true')
            }
        }
        // 統一處理錯誤請求
        const code = response.data.code;
        const message = response.data.message;
        if (response.statusCode == 200 && code !== 0 && code != -1 && code) {
            uni.showToast({
                title: message,
                icon: "none",
                duration: 2000
            });
        }
        return response;
    }
    return http.request({
        name: name,
        baseUrl: config.base,
        url: config.interface[name].path,
        method: config.interface[name].method ? config.interface[name].method : 'GET',
        dataType: 'json',
        data,
    })
}

export default {
    execute
}
    // 刷新 token 方法
    async function doRequest(response) {
        const res = await execute('refresh', {refreshToken: uni.getStorageSync('refreshToken')})
        const {
            code,
            data
        } = res.data
        if (code == 0) {
            uni.setStorageSync('accessToken', data.accessToken)
            uni.setStorageSync('refreshToken', data.refreshToken)
            let config = response.config
            config.header['x-access-token'] = data.accessToken
            const resold = await execute(config.name,{ ...config.data
            })
            return resold
        } else {
            uni.removeStorageSync('accessToken');
            uni.removeStorageSync('refreshToken');
            uni.showToast({
                title: '登陸過期請重新登陸!',
                icon: "none",
                success() {
                    Router.push({
                        name: 'login',
                        params: {
                            'RouterName': 'home'
                        }
                    })
                }
            });
        }
    }

以上就是uniapp無痛刷新token的方法的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘孜| 公安县| 敦化市| 平利县| 固原市| 许昌市| 乌拉特中旗| 安图县| 壤塘县| 东丰县| 宁阳县| 南开区| 虹口区| 永安市| 礼泉县| 乌兰县| 尼勒克县| 清原| 黎平县| 株洲县| 墨竹工卡县| 威宁| 太白县| 八宿县| 平武县| 太康县| 项城市| 阿克苏市| 聂拉木县| 宜丰县| 库车县| 博兴县| 平凉市| 龙游县| 措美县| 葫芦岛市| 都江堰市| 长乐市| 綦江县| 通渭县| 丹东市|