【慧游鲁博】【8】前后端用户信息管理:用户基本信息在小程序端的持久化与随时获取
文章目录
- 本次更新
- 整体流程概述
- 1. 用户登录流程
- 前端登录处理 (`login.vue`)
- 后端登录处理 (`AuthServiceImpl.java`)
- 2. 用户信息存储机制
- 前端状态管理 (`member.js`)
- 3. 后续请求的身份验证
- 登录拦截器 (`LoginInterceptor.java`)
- 前端请求携带token
- 4. 获取用户信息
- 获取用户信息接口 (`UserController.java`)
- 前端获取和存储用户信息
- 安全设计考虑
- 综上所述
本次更新
在小程序端获取并保存当前用户的详细信息,支持后续对用户信息的使用。
整体流程概述
整个用户信息管理流程可以分为以下几个关键步骤:
- 用户登录:前端发送登录请求,后端验证并返回token
- 信息存储:前端存储token并获取用户详细信息
- 后续请求:每次请求携带token进行身份验证
- 信息获取:通过存储的token获取用户信息
下面我将详细分析每个环节的实现。
1. 用户登录流程
前端登录处理 (login.vue
)
在前端的handleLogin
方法中,主要完成了以下工作:
async handleLogin() {// 验证输入...// 发送登录请求const res = await post('/user/login', {username: this.loginForm.username,password: this.loginForm.password})// 存储tokenconst memberStore = useMemberStore()memberStore.setToken(res)uni.setStorageSync('token', res)// 获取用户详细信息并存储const userInfoRes = await get('/user/getUserInfo')memberStore.setUserInfo(userInfoRes)// 跳转逻辑...
}
- 前端发送登录请求到
/user/login
接口,携带用户名和密码 - 登录成功后,将返回的token存储到Pinia状态管理和uni-app的本地存储中
- 随后立即调用
/user/getUserInfo
获取用户详细信息并存储
后端登录处理 (AuthServiceImpl.java
)
后端登录逻辑主要位于AuthServiceImpl
类中:
public Result<String> login(UserLoginDTO loginDTO) {// 查询用户User user = this.getOne(new LambdaQueryWrapper<User>().eq(User::getUsername, loginDTO.getUsername()));// 验证用户存在性和密码if (user == null) return Result.fail(ErrorCode.USER_NOT_EXIST);if (!Md5Util.getMD5String(loginDTO.getPassword()).equals(user.getPassword())) {return Result.fail(ErrorCode.PASSWORD_ERROR);}// 生成JWT tokenMap<String, Object> claims = new HashMap<>();claims.put("id", user.getId());claims.put("username", user.getUsername());String token = JwtUtil.genToken(claims);// 将token存入RedisredisService.set(token, token, 1, TimeUnit.HOURS);return Result.success(token);
}
- 验证用户名和密码
- 生成包含用户ID和用户名的JWT token
- 将token存入Redis,设置1小时有效期
- 返回token给前端
2. 用户信息存储机制
前端状态管理 (member.js
)
前端使用Pinia进行状态管理,关键代码如下:
const profile = ref({token: '', // 登录令牌userInfo: null // 用户详细信息
})// 设置token
const setToken = (token) => {profile.value.token = token || ''
}// 设置用户信息
const setUserInfo = (userInfo) => {profile.value.userInfo = userInfo || null
}// 持久化配置
{persist: {storage: {getItem(key) {return uni.getStorageSync(key)},setItem(key, value) {uni.setStorageSync(key, value)},},}
}
- 使用
profile
对象存储token和用户信息 - 提供
setToken
和setUserInfo
方法更新状态 - 配置了持久化存储,将状态同步到uni-app的本地存储中
这种设计实现了:
- 内存中快速访问用户信息
- 页面刷新后仍能保持登录状态
- 统一的用户信息管理接口
3. 后续请求的身份验证
登录拦截器 (LoginInterceptor.java
)
后端通过拦截器验证每个请求的身份:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 从请求头获取tokenString token = request.getHeader("Authorization");try {// 从Redis验证token有效性String redisToken = operations.get(token);if (redisToken==null) throw new RuntimeException();// 解析token获取用户信息Map<String, Object> claims = JwtUtil.parseToken(token);// 存储到ThreadLocal中供后续使用ThreadLocalUtil.set(claims);return true;} catch (Exception e) {response.setStatus(401);return true;}
}
- 从
Authorization
请求头获取token - 检查Redis中是否存在该token(确保未过期)
- 解析token获取用户信息并存入ThreadLocal
- 验证失败返回401状态码
前端请求携带token
前端在member.js
中提供了获取token的方法:
// 获取token
const getToken = () => {return profile.value.token
}
在发起API请求时,前端应该从store中获取token并添加到请求头中:
const token = memberStore.getToken()
const res = await request({url: '/api/protected',headers: {'Authorization': token}
})
4. 获取用户信息
获取用户信息接口 (UserController.java
)
后端提供获取用户信息的接口:
@GetMapping("/getUserInfo")
public Result<UserVO> getUserInfo() {return userService.getUserInfo();
}
前端获取和存储用户信息
前端在登录成功后立即获取用户信息:
// 获取用户详细信息并存储
const userInfoRes = await get('/user/getUserInfo')
memberStore.setUserInfo(userInfoRes)
之后可以通过store随时获取(我亲爱的队友们,请你们关注这里):
const memberStore = useMemberStore()
const userInfo = memberStore.getUserInfo()
安全设计考虑
- Token有效期:后端设置token 1小时有效期(Redis中)
- 密码安全:后端存储密码的MD5哈希值而非明文
- 信息最小化:Token中只包含必要信息(id和username)
- HTTPS传输:虽然代码中未体现,但生产环境应使用HTTPS
综上所述
这套用户信息管理机制实现了:
- 安全的登录流程:验证用户名密码后生成有时效性的token
- 前后端状态同步:前端存储token和用户信息,后端验证每个请求
- 持久化存储:即使刷新页面也能保持登录状态
- 便捷的信息获取:通过store可以随时获取当前用户信息
相关文章:

【慧游鲁博】【8】前后端用户信息管理:用户基本信息在小程序端的持久化与随时获取
文章目录 本次更新整体流程概述1. 用户登录流程前端登录处理 (login.vue)后端登录处理 (AuthServiceImpl.java) 2. 用户信息存储机制前端状态管理 (member.js) 3. 后续请求的身份验证登录拦截器 (LoginInterceptor.java)前端请求携带token 4. 获取用户信息获取用户信息接口 (Us…...
上位机知识篇---keil IDE操作
文章目录 前言文件操作按键新建打开保存保存所有编辑操作按键撤销恢复复制粘贴剪切全选查找书签操作按键添加书签跳转到上一个书签跳转到下一个书签清空所有书签编译操作按键编译当前文件构建目标文件重新构建调试操作按键进入调试模式复位全速运行停止运行单步调试逐行调试跳出…...
Odoo: Owl Hooks 深度解析技术指南
你好!作为一名 Odoo 开发者,深入理解其前端框架 Owl.js,尤其是 Hooks,是提升开发效率和代码质量的关键。这份指南将带你从基础概念到高级应用,全面掌握 Odoo 18 中 Owl Hooks 的所有知识点。 1. Hooks 核心概念介绍 什…...

SpringBoot返回xml
默认情况下引入web依赖后自带了JackJson 返回JSON数据 你也可以引入fastJSON 那么方便使用可以用JSON.xxx 如果希望Boot默认返回xml数据 <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml<…...

【案例篇】 实现简单SSM工程-后端
简介 本篇文章将带你从0到1的实现一个SSM项目,通过此案例可以让你在项目中对SpringBoot的使用有一个更加详细的认识,希望这个简单的案例能够帮到你。文章内容若存在错误或需改进的地方,欢迎大家指正!若对操作有任何疑问欢迎留言&a…...

零基础学习计算机网络编程----网络基本知识
目录 1. 计算机网络发展 1.1 网络发展 1.2 媒介 2 认识协议 2.1 为什么要有协议 2.2 协议的本质 3 网络协议的初识 3.1 什么是协议分层 3.2 为什么会有 4. OSI七层模型 4.1 定义 5. TCP/IP五层(或四层)模型 5.1 有什么 6. 网络传输基本流程 6.1 网络传输流程图…...

Zynq和Microblaze的区别和优势
Zynq芯片包含了一颗双核ARM Cortex-A9处理器,这是一颗“硬”处理器---它是芯片上专用 而且优化过的硅片原件。 MicroBlaze为“软”处理器,它是由可编程逻辑部分的单元组合而成的, 也就是说,一个 软处理器的实现和部署在FPGA的逻…...

FastAPI 支持文件下载
FastAPI 支持文件下载 FastAPI 支持文件上传 Python 获取文件类型 mimetype 文章目录 1. 服务端处理1.1. 下载小文件1.2. 下载大文件(yield 支持预览的)1.3. 下载大文件(bytes)1.4. 提供静态文件服务 2. 客户端处理2.1. 普通下载2…...

CNN卷积神经网络到底卷了啥?
参考视频:卷积神经网络(CNN)到底卷了啥?8分钟带你快速了解! 我们知道: 图片是由像素点构成,即最终的成像效果是由背后像素的颜色数值所决定 在Excel中:有这样一个由数值0和1组成的66…...
vue中v-clock指令
基础 v-cloak 是 Vue 中的一个非常实用的指令,用于防止在 Vue 实例尚未挂载完成前,用户看到模板中的插值语法(如 {{ message }})一闪而过。 ✅ 场景举例 你在页面还没加载完前,可能会看到这样一瞬间的内容ÿ…...

MIT 6.S081 2020Lab5 lazy page allocation 个人全流程
文章目录 零、写在前面一、Eliminate allocation from sbrk()1.1 说明1.2 实现 二、Lazy allocation2.1 说明2.2 实现 三、Lazytests and Usertests3.1 说明3.2 实现3.2.1 lazytests3.2.2 usertests 零、写在前面 可以阅读下4.6页面错误异常 像应用程序申请内存,内…...

C++初阶-list的使用2
目录 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函数的简单介绍 基本用法 函数原型 使用函数对象作为谓词 使用普通函数作为谓词 注意事项 复杂对象示例 2.2remove与remove_if的简单使用 3.std::list::unique的使用 …...
PHP序列化数据格式详解
PHP序列化数据格式详解 概述 PHP序列化是将PHP变量(包括对象)转换为可存储或传输的字符串表示形式的过程。了解这些序列化格式对于数据处理、调试和安全性分析非常重要。本文将详细介绍PHP中各种数据类型的序列化表示方式。 基本数据类型序列化格式 …...

如何优化 MySQL 存储过程的性能?
文章目录 1. 优化 SQL 语句避免全表扫描减少子查询,改用 JOIN避免 SELECT 2. 合理使用索引3. 优化存储过程结构减少循环和临时变量避免重复计算 4. 使用临时表和缓存5. 优化事务处理6. 分析和监控性能7. 优化数据库配置8. 避免用户自定义函数(UDF&#…...
深度学习:损失函数与激活函数全解析
目录 深度学习中常见的损失函数和激活函数详解引言一、损失函数详解1.1 损失函数的作用与分类1.2 回归任务损失函数1.2.1 均方误差(MSE)1.2.2 平均绝对误差(MAE) 1.3 分类任务损失函数1.3.1 交叉熵损失(Cross-Entropy&…...
【大前端】Node Js下载文件
NodeJs 获取远程文件有很多方式,常见的方式有以下两种: - fetch(原生) - axios(插件) 通过 Fetch 下载文件,代码如下: import fs from node:fsfunction main(){fetch(http://xxx.x…...
自训练NL-SQL模型
使用T5小模型在笔记本上训练 nature language to SQL/自然语言 转SQL 实测通过。 本文介绍了如何在笔记本上使用T5小模型训练自然语言转SQL的任务。主要内容包括:1) 创建Python 3.9环境并安装必要的依赖包;2) 通过Hugging Face镜像下载wikisql数据集和T5-small模型;3) 实现…...

创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!
能源与环境领域的时空数据预测面临特征解析与参数调优双重挑战。CNN-LSTM成为突破口:CNN提取空间特征,LSTM捕捉时序依赖,实现时空数据的深度建模。但混合模型超参数(如卷积核数、LSTM层数)调优复杂,传统方法…...

【Flutter】创建BMI计算器应用并添加依赖和打包
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍创建BMI计算器应用并添加依赖和打包。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…...

【Linux 学习计划】-- 倒计时、进度条小程序
目录 \r 、\n、fflush 倒计时 进度条 进度条进阶版 结语 \r 、\n、fflush 首先我们先来认识这三个东西,这将会是我们接下来两个小程序的重点之一 首先是我们的老演员\n,也就是回车加换行 这里面其实包含了两个操作,一个叫做回车&…...

微服务的应用案例
从“菜市场”到“智慧超市”:一场微服务的变革之旅 曾经,我们的系统像一个熙熙攘攘的传统菜市场。所有功能模块(摊贩)都挤在一个巨大的单体应用中。用户请求(买菜的顾客)一多,整个市场就拥堵不堪…...
后端开发概念
1. 后端开发概念解析 1.1. 什么是服务器,后端服务 1.1.1. 服务器 服务器是一种提供服务的计算机系统,它可以接收、处理和响应来自其他计算机系统(客户端)的请求。服务器主要用于存储、处理和传输数据,以便客户端可以…...

2025网络安全趋势报告 内容摘要
2025 年网络安全在技术、法规、行业等多个维度呈现新趋势。技术上,人工智能、隐私保护技术、区块链、量子安全技术等取得进展;法规方面,数据安全法规进一步细化;行业应用中,物联网、工业控制系统安全升级,供…...

云原生安全基石:深度解析HTTPS协议(从原理到实战)
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念:HTTPS是什么? HTTPS(HyperText Transfer Protocol Secure)是HTTP协议的安全版本,…...

Autodl训练Faster-RCNN网络--自己的数据集(一)
参考文章: Autodl服务器中Faster-rcnn(jwyang)复现(一)_autodl faster rcnn-CSDN博客 Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)_faster rcnn autodl-CSDN博客 食用指南:先跟着参考文章一进行操作,遇到问题再来看我这里有没有解…...

python打卡day36
复习日 仔细回顾一下神经网络到目前的内容,没跟上进度的补一下进度 作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。探索性作业(随意完成):尝试进入nn.M…...
8.Java 8 日期时间处理:从 Date 的崩溃到 LocalDate 的优雅自救
一、被 Date 逼疯的程序员:那些年踩过的坑 还记得刚学 Java 时被Date支配的恐惧吗? 想获取 "2023 年 10 月 1 日"?new Date(2023, 9, 1)—— 等等,为什么月份是 9?哦对,Java 的月份从 0 开…...
基于Python的全卷积网络(FCN)实现路径损耗预测
以下是一份详细的基于Python的全卷积网络(FCN)实现路径损耗预测的技术文档。本方案包含理论基础、数据生成、模型构建、训练优化及可视化分析,代码实现约6000字。 基于全卷积网络的无线信道路径损耗预测系统 目录 问题背景与需求分析系统架构设计合成数据生成方法全卷积网络…...
【ubuntu】安装NVIDIA Container Toolkit
目录 安装NVIDIA Container Toolkit 安装依赖 添加密钥和仓库 配置中国科技大学(USTC) 镜像 APT 源 更新 APT 包列表 安装 NVIDIA Container Toolkit 验证安装 重启docker 起容器示例命令 【问题】如何在docker中正确使用GPU? 安装…...

Paimon和Hive相集成
Flink版本1.17 Hive版本3.1.3 1、Paimon集成Hive 将paimon-hive-connector.jar复制到auxlib中,下载链接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通过flink进入查看paimon /opt/softwares/flink-1.…...