【工作实践-11】关于uniapp切换账号登录失败问题

embedded/2024/9/23 7:19:56/

遇到问题:在使用uniapp写的程序中,第一次打开程序登录(账号密码正确),调用登录接口,没有任何问题,正常登录;退出登陆后,输入不同的账号密码(账号密码均正确),调用登录接口提示登陆失败。很迷惑。

揭露原因:第一次登陆时查看接口详细信息,发现请求头中header携带的token为空,第二次用不同的账号密码登录时,接口请求头中header携带的token是第一次登录用户的token。前端在调用接口时,如果携带token,后端会通过判断token值来拦截请求,此时第一次的token与第二次登录用户的token不一致,所以导致登陆失败的结果。

如何修改:知道原因后,看了请求封装中的代码

const isToken = withToken === false     // withToken表示此接口是否需要token
if (!isToken) {const token = uni.getStorageSync('AccessTokenKey')if (!token) {uni.showModal({title: '登录',content: '该功能需要登录后访问',showCancel: false,success(res) {if (res.confirm) {uni.reLaunch({url: `/pages/login/login`,})}}})} else {config.header['Authorization'] = `Bearer ${token}`}}

我们知道登录接口是不需要携带token的,所以登录接口中withToken值为false,此时不会进入上面对的 if 判断,即不会对config的header做任何处理。所以第一次登录不会有任何问题。

第一次登陆成功后,用户通过登录接口请求到了自己的token。退出登录后,第二个用户登录(账号密码均正确),即使此时withToken值依旧为false,但由于不进入 if 判断,没有对header做任何处理,所以此时的 header 依旧是上一个请求接口的 header 信息,token也是上一个用户的 token 信息,提示登录失败。

修正代码:对if判断添加else分支,并对header的token信息做置空操作

        const isToken = withToken === falseif (!isToken) {const token = uni.getStorageSync('AccessTokenKey')if (!token) {uni.showModal({title: '登录',content: '该功能需要登录后访问',showCancel: false,success(res) {if (res.confirm) {uni.reLaunch({url: `/pages/login/login`,})}}})} else {config.header['Authorization'] = `Bearer ${token}`}} else {config.header['Authorization'] = ''}

收获:在写 if 或其它任何条件分支的代码时,一定要综合考虑多种情况,争取尽可能的考虑完善,避免疏漏。


http://www.ppmy.cn/embedded/30303.html

相关文章

关于YOLO8学习(一)环境搭建,官方检测模型部署到手机

一,环境的搭建 环境 win10 python 3.11 cmake pytorch pycharm 过程 首先安装好一个pycharm,这里就不一一叙述了。 其次,选择好一个python版本,是关键所在。有些YOLO的版本,并不支持很高的python版本,博…

Apache Kafka知识点表格总结

之前的项目中用到RabbitMQ比较多,也有用到RocketMQ,,虽然项目中没有用到过Kafka,不过自己在空闲时间学习过,而且在面试中也会问到,因为还是有不少公司用到Kafka,所以做个总结,一方面是做为面试参考&#xf…

关于下载上传的sheetjs

一、背景 需要讲后端返回来的表格数据通过前端设置导出其中某些字段,而且得是xlsx格式的。 那就考虑使用控件SheetJS。如果是几年前,一般来说,保存excel的文件都是后端去处理,处理完成给前端一个接口,前端调用了打开…

(详细整理!!!!)Tensorflow与Keras、Python版本对应关系!!!

小伙伴们大家好,不知道大家有没有被tensorflow框架困扰过 今天我就给大家整理一下tensorflow和keras、python版本的对应关系 大家这些都可以在官网找到,下面我把官网的连接给大家放在这里:在 Windows 环境中从源代码构建 | TensorFlow (g…

使用protoc-jar-maven-plugin生成grpc项目

在《使用protobuf-maven-plugin生成grpc项目》中我们使用protobuf-maven-plugin完成了grpc代码的翻译。本文我们将只是替换pom.xml中的部分内容,使用protoc-jar-maven-plugin来完成相同的功能。总体来说protoc-jar-maven-plugin方案更加简便。 环境 见《使用proto…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式,但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式,旨在通过使用一个工厂类来创建对象,而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护,因为新的对…

JavaScript中的Math对象方法、Date对象方法

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 🌟Math对象方法🍄1 Math静态属性🍄2 Math…

Go语言基本语法(五)标识符、关键字、操作符、分隔符和字面量

在Go语言中,程序的基本构建块包括标识符、关键字、操作符、分隔符和字面量,它们共同构成了Go语言的语法基础。以下是这些元素的详细介绍: 标识符(Identifier) Go语言中的标识符是用来命名程序元素(如变量…