uni-app开发app保持登录状态

uni-app 中实现用户登录一次后在 token 过期前一直免登录的功能,可以通过以下几个关键步骤实现:本地持久化存储 Token、使用请求与响应拦截器自动处理 Token 刷新、以及在 App.vue 中结合 pages.json 设置登录状态跳转逻辑


✅ 一、pages.json 配置说明

pages.jsonuni-app 的全局配置文件,用于定义页面路径、窗口样式、启动页等。虽然它不直接支持登录状态判断,但可以配合 App.vueonLaunch 生命周期实现登录状态的控制。

示例 pages.json 配置:

{"pages": [{"path": "pages/home/home","style": {"navigationBarTitleText": "主页"}},{"path": "pages/login/login","style": {"navigationBarTitleText": "登录"}}],"globalStyle": {"navigationBarTitleText": "uni-app","navigationBarBackgroundColor": "#ffffff","backgroundColor": "#ffffff"},"window": {"navigationBarTitleText": "uni-app"},"tabBar": {"list": [{"pagePath": "pages/home/home","text": "主页"},{"pagePath": "pages/user/user","text": "我的"}]}
}

⚠️ 注意:pages.json第一个页面 是默认启动页(即 App 启动时进入的第一个页面)。我们会在 App.vue 中动态决定跳转哪一个页面。


✅ 二、App.vue 中实现登录状态判断

App.vueonLaunch 生命周期是应用启动时的入口,适合在此判断用户是否已经登录(通过 Token 是否存在和是否过期),从而决定是否跳转到登录页或主页。

示例代码(App.vue):

<script>
export default {onLaunch() {// 检查本地是否存在有效的 tokenconst token = uni.getStorageSync('token');const expireTime = uni.getStorageSync('tokenExpireTime');if (token && Date.now() < expireTime) {// token 有效,跳转到主页uni.reLaunch({url: '/pages/home/home'});} else {// token 无效或不存在,跳转到登录页uni.reLaunch({url: '/pages/login/login'});}}
}
</script>

✅ 三、登录与 Token 存储逻辑

在登录成功后,需将 tokenrefreshToken 存入本地存储,并记录 token 的过期时间。

示例代码(login.vue):

<script>
export default {methods: {async handleLogin() {const res = await uni.request({url: 'https://api.example.com/login',method: 'POST',data: {username: this.username,password: this.password}});const { token, refreshToken, expiresIn } = res.data;// 存储 token 和 refresh tokenuni.setStorageSync('token', token);uni.setStorageSync('refreshToken', refreshToken);// 计算 token 过期时间(单位:毫秒)const expireTime = Date.now() + expiresIn * 1000;uni.setStorageSync('tokenExpireTime', expireTime);// 登录成功后跳转到主页uni.reLaunch({url: '/pages/home/home'});}}
}
</script>

✅ 四、请求与响应拦截器自动处理 Token

通过封装请求拦截器和响应拦截器,可以实现自动添加 token 到请求头、以及在 token 过期时自动刷新。

请求拦截器(添加 token)

uni.addInterceptor('request', {invoke(args) {const token = uni.getStorageSync('token');if (token) {args.header = {...args.header,Authorization: `Bearer ${token}`};}return args;}
});

响应拦截器(token 刷新)

uni.addInterceptor('request', {response: (res) => {if (res.statusCode === 401) {// token 过期,尝试刷新return refreshToken().then((newToken) => {uni.setStorageSync('token', newToken.token);uni.setStorageSync('tokenExpireTime', Date.now() + newToken.expiresIn * 1000);return uni.request(res.config); // 重新发送原请求}).catch(() => {uni.reLaunch({ url: '/pages/login/login' }); // 刷新失败则跳转登录页});}return res;}
});

refreshToken() 函数示例:

async function refreshToken() {const refreshToken = uni.getStorageSync('refreshToken');const res = await uni.request({url: 'https://api.example.com/refresh-token',method: 'POST',data: { refreshToken }});return res.data;
}

✅ 五、Token 即将过期时主动刷新

在每次请求前检查 token 是否即将过期,提前刷新以避免请求失败。

function isTokenExpired() {const now = Date.now();const expireTime = uni.getStorageSync('tokenExpireTime');return now >= expireTime;
}uni.addInterceptor('request', {invoke(args) {if (isTokenExpired()) {return refreshToken().then((newToken) => {uni.setStorageSync('token', newToken.token);uni.setStorageSync('tokenExpireTime', Date.now() + newToken.expiresIn * 1000);return uni.request(args); // 重新发送请求}).catch(() => {uni.reLaunch({ url: '/pages/login/login' });});}return args;}
});

✅ 六、安全建议(可选)

  • 加密存储:使用 AES 或 RSA 加密敏感数据(如 token)。
  • Token 锁机制:防止多个请求同时触发刷新。
  • 清理本地存储:用户登出时清除 token 和 refreshToken
  • 敏感信息不要明文存储

✅ 七、总结

步骤内容
1. pages.json配置页面路径和启动页
2. App.vue使用 onLaunch 判断登录状态
3. 登录逻辑登录成功后存储 token 和 refresh token
4. 请求拦截器自动添加 token 到请求头
5. 响应拦截器自动刷新 token 并重试请求
6. 主动刷新 token在请求前检查 token 是否即将过期

通过以上完整流程,你可以实现用户在 uni-app 中登录一次后,在 token 过期前免登录的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89614.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21、MQ常见问题梳理

目录 ⼀ 、MQ如何保证消息不丢失 1 、哪些环节可能会丢消息 2 、⽣产者发送消息如何保证不丢失 2.1、⽣产者发送消息确认机制 2.2、Rocket MQ的事务消息机制 2.3 、Broker写⼊数据如何保证不丢失 2.3.1** ⾸先需要理解操作系统是如何把消息写⼊到磁盘的**。 2.3.2然后来…

MySQL数据库--SQL DDL语句

SQL--DDL语句 1&#xff0c;DDL-数据库操作2&#xff0c;DDL-表操作-查询3&#xff0c;DDL-表操作-创建4&#xff0c;DDL-表操作-数据类型4.1&#xff0c;DDL-表操作-数值类型4.2&#xff0c;DDL-表操作-字符串类型4.3&#xff0c;DDL-表操作-日期时间类型4.4&#xff0c;实例 …

Spring Cloud 服务追踪实战:使用 Zipkin 构建分布式链路追踪

Spring Cloud 服务追踪实战&#xff1a;使用 Zipkin 构建分布式链路追踪 在分布式微服务架构中&#xff0c;一个用户请求往往需要经过多个服务协作完成&#xff0c;如果出现性能瓶颈或异常&#xff0c;排查会非常困难。此时&#xff0c;分布式链路追踪&#xff08;Distributed…

Linux云计算基础篇(6)

一、IO重定向和管道 stdin&#xff1a;standard input 标准输入 stdout&#xff1a;standard output 标准输出 stderr&#xff1a; standard error 标准错误输出 举例 find /etc/ -name passwd > find.out 将正确的输出重定向在这个find.ou…

Python将COCO格式分割标签绘制到对应的图片上

Python将COCO格式分割标签绘制到对应的图片上 前言前提条件相关介绍COCO 格式简介&#xff08;实例分割&#xff09;&#x1f4c1; 主要目录结构&#xff1a;&#x1f4c4; JSON 标注文件结构示例&#xff1a;✅ 特点&#xff1a; 实验环境Python将COCO格式分割标签绘制到对应的…

光纤(FC)交换机与以太网(网络)交换机的区别

光纤通道交换机&#xff08;FC交换机&#xff09;与普通以太网交换机&#xff08;网络交换机&#xff09;在用途、协议、性能、可靠性等方面存在显著差异&#xff0c;主要区别如下&#xff1a; 1. 用途与网络类型 FC交换机 主要用于存储区域网络&#xff08;SAN&#xff09;&a…

电磁场有限元方法EX2.2-里兹法求解泊松方程控制的边值问题

电磁场有限元方法EX2.2-里兹法求解泊松方程控制的边值问题 简单学习一下有限元法的基础理论&#xff0c;书本为电磁场有限元经典教材&#xff1a; THE FINITE ELEMENT METHOD IN ELECTROMAGNETICS, JIAN-MING JIN 目录 电磁场有限元方法EX2.2-里兹法求解泊松方程控制的边值问…

云端备份与恢复策略:企业如何选择最安全的备份解决方案

更多云服务器知识&#xff0c;尽在hostol.com 想象一下&#xff0c;某个凌晨&#xff0c;你突然发现公司所有重要数据都被加密&#xff0c;系统崩溃&#xff0c;业务停摆。有人给你打来电话说&#xff1a;“一切都被勒索了&#xff0c;恢复费用可能需要几百万。”这时&#xf…

OSPF高级特性之FRR

一、概述 众所周知,IGP当中链路状态路由协议(OSPF、ISIS)之所以可以代替我们的矢量路由协议(RIP),就是因为链路状态路由协议可以根据某些特性快速的感知到路由的变化从而改变路径。 前面我们已经介绍过了OSPF的其中一个快速收敛的机制,SPF算法,本章节将介绍另一个快速收敛机制,…

多元化国产主板,满足更高性能、更高安全的金融发展

在金融行业数字化转型的浪潮中&#xff0c;对于核心硬件的性能与安全需求达到了前所未有的高度。国产主板应运而生&#xff0c;凭借其卓越的多元化特性&#xff0c;为金融领域带来了高性能运算与高安全防护的双重保障&#xff0c;成为推动金融行业发展的关键力量。以高能计算机…

数据库分布式架构:ShardingSphere 实践

一、数据库分布式架构概述 1.1 分布式架构概念 在当今数字化时代&#xff0c;随着业务的不断拓展和数据量的爆炸式增长&#xff0c;传统的单机数据库架构逐渐暴露出诸多局限性。例如&#xff0c;在电商大促期间&#xff0c;海量的订单数据和用户访问请求会让单机数据库不堪重…

【WRFDA教程第二期】运行WRFDA 3DVAR/4DVAR数据同化

目录 一、准备阶段&#xff1a;下载并解压测试数据二、运行 3DVAR 教学实验日志分析&#xff08;wrfda.log&#xff09;进阶实验建议&#xff1a;对比不同设置的影响输出文件说明 三、运行 4DVAR 教学实验步骤1&#xff1a;准备工作目录与环境变量步骤2&#xff1a;链接可执行文…

redis缓存三大问题分析与解决方案

什么是缓存&#xff1f; 缓存&#xff08;Cache&#xff09;是一种将热点数据缓存在内存中&#xff08;如 Redis&#xff09;以加快访问速度、减轻数据库压力的技术。 但引入缓存后可能出现 三大核心问题&#xff1a; 缓存穿透&#xff08;Cache Penetration&#xff09;缓存…

李宏毅机器学习笔记——梯度下降法

深度学习介绍 基于仿生学的一种自成体系的机器学习算法&#xff0c;包括但不限于图像识别、语音、文本领域。 梯度下降法 作为深度学习算法种常用的优化算法 梯度下降法&#xff0c;是一种基于搜索的最优化方法&#xff0c;最用是最小化一个损失函数。梯度下降是迭代法的一…

day50/60

浙大疏锦行 DAY 50 预训练模型CBAM模块 知识点回顾&#xff1a; resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 ps&#xff1a;今日的代码训练时长较长&#xff0c;3080ti大概需要40min的训练时长 作业&#xff1a; 好好理解下resnet18的…

Vue3 之vite.config.js配置

一、示例 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],base: ./,build: {assetsDir: static, //指定静态资源目录rollupOptions: {input: {mai…

利用Gpu训练

方法一&#xff1a; 分别对网络模型&#xff0c;数据&#xff08;输入&#xff0c;标注&#xff09;&#xff0c;损失函数调用.cuda() 网络模型&#xff1a; if torch.cuda.is_available():netnet.cuda() 数据&#xff08;训练和测试&#xff09;&#xff1a; if torch.cud…

使用excel中的MATCH函数进行匹配数据

一、背景 在平日处理数据时&#xff0c;经常需要将给定数据按照制定的数据进行排序&#xff0c;数量比较大时&#xff0c;逐个处理有点费事费力且容易出错&#xff0c;这时可借助excel表格中match函数进行精确匹配。 二、使用match函数–精确排序操作步骤 主要工作步骤&#xf…

SpringCloud系列(41)--SpringCloud Config分布式配置中心简介

前言&#xff1a;微服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对较小&#xff0c;因此系统中会出现大量的服务&#xff0c;但由于每个服务都需要必要的配置信息才能运行&#xff0c;所以—套集中式的、动态的配置管理设施是必不可少的&…

wireshark介绍和使用

Wireshark 介绍 Wireshark 是一款开源的 网络协议分析工具&#xff08;Packet Sniffer&#xff09;&#xff0c;用于捕获和分析网络数据包。它支持多种协议解析&#xff0c;适用于网络调试、安全分析、网络教学等场景。 官网&#xff1a;https://www.wireshark.org/ 特点&#…