// 此vm参数为页面的实例,可以通过它引用vuex中的变量
module.exports = (vm) => {// 初始化请求配置uni.$u.http.setConfig((config) => {/* config 为默认全局配置*/config.baseURL = '/'; /* 根域名 */config.header = {}return config})// 请求队列let requestList = []// 是否正在刷新中let isRefreshToken = false// 请求拦截uni.$u.http.interceptors.request.use(async (config) => { // 可使用async await 做异步操作if (['DELETE'].includes(config.method)) {config.header = {...config.header,'content-type': 'application/x-www-form-urlencoded;charset=UTF-8'}}config.header["Authorization"] = `Bearer ${uni.getStorageSync("accessToken")}`;return config}, config => { // 可使用async await 做异步操作return Promise.reject(config)})// 响应拦截uni.$u.http.interceptors.response.use(async (response) => {if (response.data.msg === '刷新令牌已过期' || response.data.msg === '无效的刷新令牌') {return handleAuthorized(response.data)}if (response.data.code === 401) {// 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了if (!isRefreshToken) {isRefreshToken = true;let refreshToken = uni.getStorageSync("refreshToken")// console.log(refreshToken)// 1. 如果获取不到刷新令牌,则只能执行登出操作if (!refreshToken) {return handleAuthorized(response.data)}// 2. 进行刷新访问令牌try {const refreshTokenRes = await uni.$u.http.post("/member/auth/refresh-token?refreshToken=" +uni.getStorageSync("refreshToken"))if (refreshTokenRes.code === 401) {return handleAuthorized(response.data)}// 2.1 刷新成功,则回放队列的请求 + 当前请求uni.setStorageSync("refreshToken", refreshTokenRes.data.refreshToken)uni.setStorageSync("accessToken", refreshTokenRes.data.accessToken)requestList.forEach(cb => cb())return new Promise(resolve => {resolve(uni.$u.http.request(response.config))})} catch (e) { // 为什么需要 catch 异常呢?刷新失败时,请求因为 Promise.reject 触发异常。// 2.2 刷新失败,只回放队列的请求requestList.forEach(cb => cb())// 提示是否要登出。即不回放当前请求!不然会形成递归return handleAuthorized(response.data)} finally {requestList = []isRefreshToken = false}} else {// 添加到队列,等待刷新获取到新的令牌return new Promise(resolve => {requestList.push(() => {resolve(uni.$u.http.request(response.config))})})}}uni.hideLoading()return response.data}, (response) => {console.error("网络异常")return Promise.reject(response)})function handleAuthorized(data) {uni.$u.toast('验证失败,请重新登录');// 函数节流uni.$u.throttle(() => {uni.reLaunch({url: '/pages/login/login'});}, 1000 * 10)return data}}

uniapp使用uview(luch-request),无痛刷新token相关推荐

  1. uniapp全局请求插件luch-request 无痛刷新token

    场景:单独请求遇到后台接口请求返回401或者400时,需要重新刷新token再重新请求原本的接口,又不能迫使用户刷新页面. let http = new Request({baseURL: url, ...

  2. axios 登录后设置header_axios如何利用promise无痛刷新token

    需求 最近遇到个需求:前端登录后,后端返回token和token有效时间,当token过期时要求用旧token去获取新的token,前端需要做到无痛刷新token,即请求刷新token时要做到用户无感 ...

  3. Laravel使用Dingo API+JWT实现认证机制 无痛刷新Token

    Laravel使用Dingo API+JWT实现认证机制 无痛刷新Token 一.安装[Dingo API](https://github.com/dingo/api) 和 [JWT](https:/ ...

  4. 无痛刷新token续接401请求

    在小程序开发中,我们都知道小程序是没有cookie的,那么用户身份是如何确定的,后段颁发token,前端每次请求头部附带token. 既然是token,那么肯定有它的过期时间,没有一个token是永久 ...

  5. 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌

    最近在做一个公司的项目,前端使用 Vue.js,后端使用 Laravel 构建 Api 服务,用户认证的包本来是想用 Laravel Passport 的,但是感觉有点麻烦,于是使用了 jwt-aut ...

  6. Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌

    最近在做一个公司的项目,前端使用 Vue.js,后端使用 Laravel 构建 Api 服务,用户认证的包本来是想用 Laravel Passport 的,但是感觉有点麻烦,于是使用了 jwt-aut ...

  7. 前端token知识梳理:token如何存储?token过期如何处理?如何无感刷新token?

    在前后端是以token的形式交互,既然是token,那么肯定有它的过期时间(为了接口数据的安全,服务器的token一般不会设置太长,根据需要一般是1-7天的样子),没有一个token是永久的,永久的t ...

  8. uniapp 实现无感刷新token, 适应大多数项目

    不管你是用taro uni 还是vue-cli 或者 react-cli 刷新token这块一通百通 本质上 都一样 我之前讲了一个是 在响应拦截哪里做token刷新 其实这样做还是不好的,因为这样我 ...

  9. Laravel6通过jwt(tymon/jwt-auth)实现API用户无感刷新TOKEN

    Laravel6通过jwt实现API用户无感刷新TOKEN 1.TOKEN是什么 2.jwt是什么 3.jwt安装&配置 3.1.通过composer安装 3.2.发布配置 3.3.生成加密密 ...

最新文章

  1. linux socket完成端口,“完成端口”模型(IOCP)
  2. 观察者模式(Observer)
  3. “十四五”大数据产业发展锚定3万亿目标
  4. 学习动态性能表(3)--v$sqlv$sql_plan
  5. shellcode中变形bindshell的实现
  6. CSDN-Code平台使用过程中的5点经验教训
  7. run()方法和start()方法测试解析
  8. powershell /遍历/psobject/字符串转换Json/json数组操作
  9. linux用u盘上传文件,linux如何挂载U盘和文件系统(或需要用到).doc
  10. UIButton 的简单运用
  11. Cortex-M0(3)---ARM Cortex-M0 异常与中断
  12. mysql数据库操作类
  13. OSChina 周五乱弹 ——我们就开个程序员餐厅!
  14. 麻省理工成立计算机学院,麻省理工学院斥资10亿美元建新计算机学院
  15. python学习之地址簿程序
  16. C语言:编译时指定头文件路径
  17. 单例模式-基类单例。。用于其他单例的派生
  18. 旺旺的新故事太多,消费者该记住哪一个?
  19. python launcher下载,python launcher是什么 python的launcher用法知识点总结
  20. Java并发知识点快速复习手册(下)

热门文章

  1. linux、C++、Java、HTML 语言学习资料总结
  2. 算法笔记(二)线性排序:一百万数据量如何进行快速的排序?
  3. php 可控制几率算法,PHP实现中奖概率算法
  4. 日志门面和日志框架(SpringBoot日志实现)
  5. python KNN分类算法 使用鸢尾花数据集实战
  6. 新娘结婚程序c语言,结婚的17个礼仪程序
  7. 屏幕直接画图和文字提示,然后一键清除
  8. [转]产品经理 书目录
  9. 记:《洛克菲勒留给儿子的38封信》-- 27
  10. js设置div不可点击