我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解uniapp无痛刷新token方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解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 文件

再修改vmeitime-http 文件夹下的 interface.js 文件,将401状态暴漏出来

如果看到这里还是看不明白,那么请看我的源码,请注意我使用了两个插件,观众们酌情理解,仔细消化,配合到自己的项目中思考...


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方法的详细内容,更多关于uni-app无痛刷新token方法的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解uniapp无痛刷新token方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

uniapp无痛刷新token的方法介绍

本篇文章和大家了解一下uniapp无痛刷新token的方法介绍。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。前端在请求接口时,和后端定义好了,如果状态码为 401 ,则表明 token 过期,需要前端请求新的 token
2023-06-15

Win7系统无法刷新DNS解析缓存的解决方案

当用户在Win7系统添加HOSTS配置之后,如果想刷新DNS分析缓存,应该采取哪些方法?。如果DNS依赖的服务没有启动,DNS分析缓存就无法刷新。我们可以使用以下方法来解决这个问题。Win7系统无法刷新DNS解析缓存的解决方案。1.单击计算
2023-07-14

Android下拉刷新以及GridView使用方法详解

GridView是类似于ListView的控件,只是GridView可以使用多个列来呈现内容,而ListView是以行为单位,所以用法上是差不多的。 主布局文件,因为要做下拉刷新,所以加了一个ProgressBar,GridView的num
2022-06-06

vant/vue实现小程序下拉刷新功能方法详解

这篇文章主要介绍了vant/vue实现小程序下拉刷新功能方法详解,需要的朋友可以参考下
2022-12-24

web前端:html文本框默认值刷新后无法继续显示解决方法

编程学习网:文本框是一个计算机系统工具,在word中文本框是指一种可移动、可调大小的文字或图形容器。在PowerPoint中,文本框是已经存在的,可以直接在文本框内编辑文字。
web前端:html文本框默认值刷新后无法继续显示解决方法
2024-04-23

GoLang jwt无感刷新与SSO单点登录限制解除的方法是什么

这篇文章主要介绍了GoLang jwt无感刷新与SSO单点登录限制解除的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇GoLang jwt无感刷新与SSO单点登录限制解除的方法是什么文章都会有所收获,
2023-07-05

帝国cms后台实现刷新多栏目内容页的方法详解

以下代码适用于帝国cms6.6版,7.0版不同处在代码注释处已标明。 找到e/admin/ChangeData.php文件 原先的栏目是单选菜单