uniapp登录成功后跳回原有页面+无感刷新token

2024-05-30 11:14

本文主要是介绍uniapp登录成功后跳回原有页面+无感刷新token,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

uniapp登录成功后跳回原有页面

引言

在C端的页面场景中,我们经常会有几种情况到登录页:

  • 区分需要登录和不用登录的页面,点击需要登录才能查看的页面
  • 已经登录但是超时,用户凭证失效等原因

以上情况可以细分为两种,一种是从未登录过的,需要第一次去登录,还一种是已经登录了,但是cookie失效了,需要重新获取用户凭证,这样的话后端会将两个状态码区分,那我们前端需要根据不同的状态码进行相应的处理。

第一次登录时

当用户从未登录时,我们需要跳到登录页去登录后再返回到原有页面,这样才是正常的交互逻辑。

  1. 第一步需要先保存当前路由
// 记录路由地址
const fungoPreviousPage = () => {let routes = getCurrentPages(); // 获取当前打开过的页面路由数组let curRoute = routes[routes.length - 1].route //获取当前页面路由let curParam = routes[routes.length - 1].options; //获取路由参数// 拼接参数let param = ''for (let key in curParam) {if (!param) {param += key + '=' + curParam[key]} else {param += '&' + key + '=' + curParam[key]}}uni.setStorageSync('pageUrl', param ? `/${curRoute}?${param}` : `/${curRoute}`)
}
  1. 登录成功后判断是否有pageUrl,有就说明回到原页面
   var pageUrl = uni.getStorageSync('pageUrl')if (pageUrl) {// 如果为tabbar页面则用reLaunch跳转if (['/pages/home/index'].includes(pageUrl)) {uni.reLaunch({url: pageUrl})} else {uni.redirectTo({url: pageUrl})}//跳转后,删除url记录避免重复跳转uni.removeStorageSync('pageUrl')} else {// 如果没有默认跳转到首页uni.reLaunch({url: '/pages/home/index'})}
  1. 回到原页面后点击返回需要返回到上一层页面(排除登录页)

    这点要注意的是整个流程是首页-a-登录页-a,如果在a页面点击返回时是要到首页,则需要注意以下

    a页面跳转到登录页时需要使用uni.redirectTo跳转,登录页跳转到a页面也需要使用uni.redirectTo

    在这里插入图片描述

cookie失效

cookie失效了需要无感知更新cookie,这个时候需要先将请求的队列存起来,等刷新cookie再去调用原来的接口就行。

后端一般会在登录成功后返回两个token值,一个用来校验用户信息,一个用来获取新的token,我这边分为token和access_token两个字段,其实就一个时效长一个时效短。

完整代码如下

  let devUrl = '';import store from '../store/index.js'import { loginOut } from './index.js'const baseUrl = devUrl;const POST = 'POST';const UPLOAD = 'UPLOAD';const SUCCESS_CODES = 200;const RefreshCode = 777;const LogoutCode = 503;const TOKEN_ERROR = 444const ERRCODE = 500let promiseQueue = []let exeQueue = falselet needBeginLogin = true// 刷新tokenasync function RefreshTokenRQ(cb) {try {if (store.state.access_token) {uni.request({url: `${baseUrl}/user/refreshToken`,data: {exchangeToken: store.state.access_token},success(res) {if (res.data.status === SUCCESS_CODES) {store.commit('setToken', res.data.data)cb && cb()} else {loginOut()}}})} else {loginOut()}} catch (e) {}}const getHeader = () => {return {token: store.state.token,};};/**** @param {string} method 请求方法* @param {string} url api地址* @param {string} data 入参*/const request = async (requestObj) => {// 显示加载中 效果// uni.showLoading({// 	title: "",// 	mask: true,// });return new Promise((resolve, reject) => {uni.request({url: `${baseUrl}${requestObj.url}`,method: requestObj.method || 'get',data: requestObj.data || {},header: Object.assign(getHeader(), requestObj.header || {}),success(res) {// 请求成功const data = res.data;requestMethods(requestObj, data, resolve, reject )},fail(err) {console.log(err);// 请求失败reject(new Error('Por favor verifique a rede'));}});})}function requestMethods (requestObj, data, resolve, reject) {if (data.status === SUCCESS_CODES) {if (requestObj.resolve) {requestObj.resolve(data.data);let promiseQueueItem = promiseQueue.shift();if (exeQueue) {exeQueue = false;while (promiseQueueItem) {request(promiseQueueItem);promiseQueueItem = promiseQueue.shift();promiseQueue = promiseQueue;}if (!promiseQueueItem) {exeQueue = true;needBeginLogin = true;}}} else {resolve(data.data);}} else {// 其他异常if (data.status === RefreshCode) {try {if (store.state.access_token) {requestObj.resolve = resolve;promiseQueue.push(requestObj); //请求失败了,把该请求放到promise队列,等待更新token后重新调用。if (!needBeginLogin) {return;}//防止重复刷新token。needBeginLogin = false;RefreshTokenRQ(() => { //获取完token以后执行回调//重新登陆以后调用一次队列中的promise;并设置队列为可循环状态。let promiseQueueItem = promiseQueue.shift();if (promiseQueueItem) {exeQueue = true;request(promiseQueueItem);}}, true)} else {loginOut()}} catch (e) {}return} else if (data.status === LogoutCode || data.status === TOKEN_ERROR) {loginOut()return;} else {uni.showToast({title: data.message,icon: 'none'});}reject(data);}}export function get(url, data, header = {}, method = 'GET') {return request({url,data,header})}export function post(url, data, header = {}, method = 'POST') {return request({url,data,method,header})}export default{get,post};

以上loginOut和store根据自己实际情况调整

这篇关于uniapp登录成功后跳回原有页面+无感刷新token的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016175

相关文章

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给