Vben5登录过期无法再次登录问题,http状态码

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


前言

最近在做项目前端,使用的https://doc.vben.pro/,在登录过期时出现了无法再次登录的问题,在此记录一下。

image

项目前面那些直接略过,如果感兴趣直接看官方文档就可以 ,以下会根据解决过程附带部分官网说明。

分析原因

梳理流程

image

文档前面的都已按照要求配置修改好了,所有的认证接口也都完成了,登录也是没有问题的,就是在accessToken过期的时候无法回到登录页面,就算直接路由到/auth/login也永远在转圈圈。

在本项目中,在登录完成后将accessToken使用pinia加持久化插件存储到localStorage中,

// 项目配置 setup.ts/*** @zh_CN 初始化pinia*/
export async function initStores(app: App, options: InitStoreOptions) {const { createPersistedState } = await import('pinia-plugin-persistedstate');pinia = createPinia();const { namespace } = options;pinia.use(createPersistedState({// key $appName-$store.idkey: (storeKey) => `${namespace}-${storeKey}`,storage: localStorage,}),);app.use(pinia);return pinia;
}// 认证相关 access.ts
...persist: {// 持久化pick: ['accessToken', 'refreshToken', 'accessCodes'],},state: (): AccessState => ({accessCodes: [],accessMenus: [],accessRoutes: [],accessToken: null,isAccessChecked: false,loginExpired: false,refreshToken: null,}),
});

然后在每次请求时使用自定义配置了请求拦截器和响应拦截器的axios中带上accessToken

// axios配置 request.tsfunction formatToken(token: null | string) {return token ? `Bearer ${token}` : null;}// 请求头处理client.addRequestInterceptor({fulfilled: async (config) => {const accessStore = useAccessStore();config.headers.Authorization = formatToken(accessStore.accessToken);config.headers['Accept-Language'] = preferences.app.locale;return config;},});// response数据解构client.addResponseInterceptor<HttpResponse>({fulfilled: (response) => {const { data: responseData, status } = response;const { code, data } = responseData;if (status >= 200 && status < 400 && code === 0) {return data;}throw Object.assign({}, response, { response });},});

在此都没问题,因为使用登录和其他接口请求和响应都没问题,问题到底在哪?

image

后端命名也是正常接收到accessToken了呀,为什么永远在转圈圈,回不去了呢?

image

那既然这样,只能使出我并没把握的前端debug了。

debug

根据前面的[Vue Router warn]: Unexpected error when starting the router: {code: 401, msg: '账号未登录'}的输出和错误栈,大概可以知道是在bootstrap.ts:33出问题了,那么先在这断一下,结合代码判断,这一步就是设置路由啊,可知一定是初始化路由出错了,导致所有路由都出问题了。

image

那么在创建路由再加上断点,在export之前操作router都点一下

image

发现可以到下面的创建路由守卫处,说明前面都还没错,那么就继续分析路由守卫

image

在继续debug中发现,在到达96行之前就提示错误,开始转圈圈了,那么错误一定是89-96之间的。

image

最后发现是在fetchUserInfo后出错的,更准确的讲是getUserInfoApi出错的。

async function fetchUserInfo() {let userInfo: null | UserInfo = null;userInfo = await getUserInfoApi();userStore.setUserInfo(userInfo);return userInfo;
}/*** 获取用户信息*/
export async function getUserInfoApi() {return requestClient.get<UserInfo>('/user/info');
}

???不是已经正常返回了吗?我也提示账号未登录了啊,那一定是response的问题,继续看axios配置,这里设置三个拦截器,看其中token过期的处理响应拦截器,正常应该走doReAuthenticate重新认证逻辑啊,怎么不行呢?

// response数据解构client.addResponseInterceptor<HttpResponse>({fulfilled: (response) => {const { data: responseData, status } = response;const { code, data } = responseData;if (status >= 200 && status < 400 && code === 0) {return data;}throw Object.assign({}, response, { response });},});// token过期的处理client.addResponseInterceptor(authenticateResponseInterceptor({client,doReAuthenticate,doRefreshToken,enableRefreshToken: preferences.app.enableRefreshToken,formatToken,}),);// 通用的错误处理,如果没有进入上面的错误处理逻辑,就会进入这里client.addResponseInterceptor(errorMessageResponseInterceptor((msg: string, error) => {// 这里可以根据业务进行定制,你可以拿到 error 内的信息进行定制化处理,根据不同的 code 做不同的提示,而不是直接使用 message.error 提示 msg// 当前mock接口返回的错误字段是 error 或者 messageconst responseData = error?.response?.data ?? {};const errorMessage = responseData?.error ?? responseData?.msg ?? '';// 如果没有错误信息,则会根据状态码进行提示message.error(errorMessage || msg);}),);

authenticateResponseInterceptor响应拦截器细看,终于抓到你了,没有进入重新认证的逻辑是因为在

response?.status !== 401true直接抛异常了。

image

啊啊啊啊,响应码不就是401吗?好吧,还真不是。

image

根因

根因就是我使用了后端的统一响应处理,将所有异常都以正常的响应返回,也就是说并没有使用http的响应码,所有能被后端处理的异常都会以响应体里的code来表示。

/*** 认证失败*/
@ExceptionHandler(NotLoginException.class)
public CommonResult<Void> handleNotLoginException(NotLoginException e, HttpServletRequest request) {String requestUri = request.getRequestURI();log.error("请求地址'{}',认证失败'{}',无法访问系统资源", requestUri, e.getMessage());return CommonResult.error(UNAUTHORIZED);
}

可是这个项目中使用了http状态码,也是axiosstatus

export interface AxiosResponse<T = any, D = any> {data: T;status: number;statusText: string;headers: RawAxiosResponseHeaders | AxiosResponseHeaders;config: InternalAxiosRequestConfig<D>;request?: any;
}

解决

解决起来也很简单,无非改造前端响应体或改在后端使用http响应,我选择了后者。

像下面这样使用org.springframework.http.ResponseEntity;再包装一下就可以了,

image

这样本次请求状态码就不是200了,正常走认证逻辑了。

image

进度

最后提一下进度吧!忘了上次提到的进度是哪里了,那就从指标版本控制之后讲吧。

1、【重要】策略集和规则的版本控制,还没做完

2、【重要】调整了项目结构,优化组件和上下文,新增规则action(发消息、打tag、加名单等)

3、【一般】新增节点、字段逻辑等通用接口,修复一些问题

4、【重要】策略的权重模式,顺序&最坏&投票&权重,在计算权重和动态字段时使用QLExpress

5、【重要】放弃逻辑删除,新增数据接入elasticsearch,增加docker-compose配置

这些是后端的,前端也要开始,有三大挑战:1、条件组合组件;2、公式类输入时联想词;3、LiteFlow编排。

image

image

image

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

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

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

相关文章

Doris安装部署

Doris 概述 Apache Doris由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过200个产品线在使用&#xff0c;部署机器超过1000台&#xff0c;单一业务最大可…

基于单片机的多功能视力保护器(论文+源码)

1.系统设计 多功能视力保护器在设计过程中能够对用户阅读过程中的各项数据信息进行控制&#xff0c;整体设计分为亮种模式&#xff0c;分别是自动模式&#xff0c;手动模式。在自动模式的控制下&#xff0c;当单片机检测当前光照不强且有人时就开启LED灯&#xff0c;并且会根据…

如何在 Ubuntu 22.04 上部署 Nginx 并优化以应对高流量网站教程

简介 本教程将教你如何优化 Nginx&#xff0c;使其能够高效地处理高流量网站。 Nginx 是一个强大且高性能的 Web 服务器&#xff0c;以其高效处理大量并发连接的能力而闻名&#xff0c;这使得它成为高流量网站的流行选择。 正确优化 Nginx 可以显著提高服务器的性能&#xff0…

【持续更新中】transformer详解和embedding大模型

这里记录一下自己学习embedding大模型的记录&#xff0c;涉及到transformer和bert这些。 一切都可以编码&#xff0c;比如说图片是三原色 背景介绍 训练集和测试集的分&#xff0c;无监督学习&#xff0c;现在基本都是使用无监督学习&#xff0c;有监督学习的话参考计算机视觉…

csrf跨站请求伪造(portswigger)无防御措施

前言&#xff1a;基础csrf学习&#xff08;没有任何防御措施&#xff09; 内容来自portswigger&#xff0c;一个靶场练习&#xff0c;国外的网站&#xff0c;可能需要翻墙 要使 CSRF 攻击成为可能&#xff0c;必须满足三个关键条件&#xff1a; 相关操作。应用程序中存在攻击…

cocos creator 3.x版本如何添加打开游戏时首屏加载进度条

前言 项目有一个打开游戏时添加载入进度条的需求。这个功能2.X版本是自带的&#xff0c;不知为何在3.X版本中移除了。 实现 先说一下解决思路&#xff0c;就是在引擎源码加载场景的位置插入一个方法&#xff0c;然后在游戏入口HTML处监听即可。 1.找到对应源码脚本 在coco…

Zookeeper在中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心的解决方案

前言 Zookeeper是什么&#xff1f; ZooKeeper 是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应…

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因&#xff08;了解&#xff09; 一、问题描述 就是在使用 IDEA 写代码时&#xff0c;IDEA 可能会弹一个窗&#xff0c;大概提示你目前使用的 IDEA 内存不足&#xff0c;其实就是提醒你 JVM 的内存不够了&#xff0c;需要重新分配。弹…

Anaconda+PyTorch(CPU版)安装

1.Anaconda下载 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 如果已安装python&#xff0c;下载之前要彻底删除之前下载的python 2.Anaconda安装 3.添加环境变量 //根据实际安装路径进行更改 D:\Anaconda D:\Anaconda\Scripts D:\…

使用apisix+oidc+casdoor配置微服务网关

一、服务架构图 二、安装配置 1. 安装配置apisix (1). 快速启动及验证&#xff1a; curl -sL https://run.api7.ai/apisix/quickstart | sh该命令启动 apisix-quickstart 和 etcd 两个容器&#xff0c;APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 …

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本&#xff0c;所以有些配置&#xff0c;是可以不用做的&#xff0c;下面仅记录新增操作&#…

STM32中断详解

STM32中断详解 NVIC 中断系统中断向量表相关寄存器中断优先级中断配置 外部中断实验EXTI框图外部中断/事件线映射中断步骤初始化代码实现 定时器中断通用定时器相关功能标号1&#xff1a;时钟源标号 2&#xff1a;控制器标号 3&#xff1a;时基单元 代码实现 NVIC 中断系统 STM…

常见的中间件漏洞

1.tomcat 1.1 CVE-2017-12615(put上传) 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产 ⽣&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利⽤PUT方法通过精心构造的数据包…

【JAVA】神经网络的基本结构和前向传播算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

Qt 12.28 day3

作业&#xff1a; 1】 思维导图 2】 在登录界面的登录取消按钮进行以下设置&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&a…

Ubuntu 20.04.1 LTS搭建nginx + php7.4运行环境

本文基于https://www.rosehosting.com/blog/how-to-install-php-7-4-with-nginx-on-ubuntu-20-04/的翻译和实践记录。 安装 Nginx 默认情况下&#xff0c;最新版本的 Nginx 位于 Ubuntu 20.04 默认存储库中。您可以使用以下命令安装它&#xff1a; apt-get install nginx -y…

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下&#xff0c;跨境电商行业正以前所未有的态势重塑国际贸易格局&#xff0c;成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》&#xff0c;…

UE5材质节点Camera Vector/Reflection Vector

Camera Vector相机向量&#xff0c;输出像素到相机的方向&#xff0c;结果归一化 会随着相机移动而改变 Reflection Vector 反射向量&#xff0c;物体表面法线反射到相机的方向&#xff0c;x和y和camera vector相反 配合hdr使用

【数据仓库】spark大数据处理框架

文章目录 概述架构spark 架构角色下载安装启动pyspark启动spark-sehll启动spark-sqlspark-submit经验 概述 Spark是一个性能优异的集群计算框架&#xff0c;广泛应用于大数据领域。类似Hadoop&#xff0c;但对Hadoop做了优化&#xff0c;计算任务的中间结果可以存储在内存中&a…

【Elasticsearch】集群配置深度解析与实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…