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

相关文章

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

90%的人第一步就错了! 顺利登录wifi路由器后台的技巧

《90%的人第一步就错了!顺利登录wifi路由器后台的技巧》登录Wi-Fi路由器,其实就是进入它的后台管理页面,很多朋友不知道该怎么进入路由器后台设置,感兴趣的朋友可以花3分钟了解一下... 你是不是也遇到过这种情况:家里网速突然变慢、想改WiFi密码却不知道从哪进路由器、新装宽带后完全不知道怎么设置?别慌

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

Spring Security重写AuthenticationManager实现账号密码登录或者手机号码登录

《SpringSecurity重写AuthenticationManager实现账号密码登录或者手机号码登录》本文主要介绍了SpringSecurity重写AuthenticationManage... 目录一、创建自定义认证提供者CustomAuthenticationProvider二、创建认证业务Us

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、