【慧游鲁博】【8】前后端用户信息管理:用户基本信息在小程序端的持久化与随时获取

news2025/7/26 8:17:26

文章目录

    • 本次更新
    • 整体流程概述
    • 1. 用户登录流程
      • 前端登录处理 (`login.vue`)
      • 后端登录处理 (`AuthServiceImpl.java`)
    • 2. 用户信息存储机制
      • 前端状态管理 (`member.js`)
    • 3. 后续请求的身份验证
      • 登录拦截器 (`LoginInterceptor.java`)
      • 前端请求携带token
    • 4. 获取用户信息
      • 获取用户信息接口 (`UserController.java`)
      • 前端获取和存储用户信息
    • 安全设计考虑
    • 综上所述

本次更新

在小程序端获取并保存当前用户的详细信息,支持后续对用户信息的使用。

在这里插入图片描述

整体流程概述

整个用户信息管理流程可以分为以下几个关键步骤:

  1. 用户登录:前端发送登录请求,后端验证并返回token
  2. 信息存储:前端存储token并获取用户详细信息
  3. 后续请求:每次请求携带token进行身份验证
  4. 信息获取:通过存储的token获取用户信息

下面我将详细分析每个环节的实现。

1. 用户登录流程

前端登录处理 (login.vue)

在前端的handleLogin方法中,主要完成了以下工作:

async handleLogin() {
  // 验证输入...
  
  // 发送登录请求
  const res = await post('/user/login', {
    username: this.loginForm.username,
    password: this.loginForm.password
  })

  // 存储token
  const memberStore = useMemberStore()
  memberStore.setToken(res)
  uni.setStorageSync('token', res)

  // 获取用户详细信息并存储
  const userInfoRes = await get('/user/getUserInfo')
  memberStore.setUserInfo(userInfoRes)
  
  // 跳转逻辑...
}
  1. 前端发送登录请求到/user/login接口,携带用户名和密码
  2. 登录成功后,将返回的token存储到Pinia状态管理和uni-app的本地存储中
  3. 随后立即调用/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 token
    Map<String, Object> claims = new HashMap<>();
    claims.put("id", user.getId());
    claims.put("username", user.getUsername());
    String token = JwtUtil.genToken(claims);

    // 将token存入Redis
    redisService.set(token, token, 1, TimeUnit.HOURS);
    
    return Result.success(token);
}
  1. 验证用户名和密码
  2. 生成包含用户ID和用户名的JWT token
  3. 将token存入Redis,设置1小时有效期
  4. 返回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)
      },
    },
  }
}
  1. 使用profile对象存储token和用户信息
  2. 提供setTokensetUserInfo方法更新状态
  3. 配置了持久化存储,将状态同步到uni-app的本地存储中

这种设计实现了:

  • 内存中快速访问用户信息
  • 页面刷新后仍能保持登录状态
  • 统一的用户信息管理接口

3. 后续请求的身份验证

登录拦截器 (LoginInterceptor.java)

后端通过拦截器验证每个请求的身份:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 从请求头获取token
    String 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;
    }
}
  1. Authorization请求头获取token
  2. 检查Redis中是否存在该token(确保未过期)
  3. 解析token获取用户信息并存入ThreadLocal
  4. 验证失败返回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()

安全设计考虑

  1. Token有效期:后端设置token 1小时有效期(Redis中)
  2. 密码安全:后端存储密码的MD5哈希值而非明文
  3. 信息最小化:Token中只包含必要信息(id和username)
  4. HTTPS传输:虽然代码中未体现,但生产环境应使用HTTPS

综上所述

这套用户信息管理机制实现了:

  1. 安全的登录流程:验证用户名密码后生成有时效性的token
  2. 前后端状态同步:前端存储token和用户信息,后端验证每个请求
  3. 持久化存储:即使刷新页面也能保持登录状态
  4. 便捷的信息获取:通过store可以随时获取当前用户信息

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

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

相关文章

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项目&#xff0c;通过此案例可以让你在项目中对SpringBoot的使用有一个更加详细的认识&#xff0c;希望这个简单的案例能够帮到你。文章内容若存在错误或需改进的地方&#xff0c;欢迎大家指正&#xff01;若对操作有任何疑问欢迎留言&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处理器&#xff0c;这是一颗“硬”处理器---它是芯片上专用 而且优化过的硅片原件。 MicroBlaze为“软”处理器&#xff0c;它是由可编程逻辑部分的单元组合而成的&#xff0c; 也就是说&#xff0c;一个 软处理器的实现和部署在FPGA的逻…

FastAPI 支持文件下载

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

CNN卷积神经网络到底卷了啥?

参考视频&#xff1a;卷积神经网络&#xff08;CNN&#xff09;到底卷了啥&#xff1f;8分钟带你快速了解&#xff01; 我们知道&#xff1a; 图片是由像素点构成&#xff0c;即最终的成像效果是由背后像素的颜色数值所决定 在Excel中&#xff1a;有这样一个由数值0和1组成的66…

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页面错误异常 像应用程序申请内存&#xff0c;内…

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的使用 …

如何优化 MySQL 存储过程的性能?

文章目录 1. 优化 SQL 语句避免全表扫描减少子查询&#xff0c;改用 JOIN避免 SELECT 2. 合理使用索引3. 优化存储过程结构减少循环和临时变量避免重复计算 4. 使用临时表和缓存5. 优化事务处理6. 分析和监控性能7. 优化数据库配置8. 避免用户自定义函数&#xff08;UDF&#…

创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!

能源与环境领域的时空数据预测面临特征解析与参数调优双重挑战。CNN-LSTM成为突破口&#xff1a;CNN提取空间特征&#xff0c;LSTM捕捉时序依赖&#xff0c;实现时空数据的深度建模。但混合模型超参数&#xff08;如卷积核数、LSTM层数&#xff09;调优复杂&#xff0c;传统方法…

【Flutter】创建BMI计算器应用并添加依赖和打包

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

【Linux 学习计划】-- 倒计时、进度条小程序

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

微服务的应用案例

从“菜市场”到“智慧超市”&#xff1a;一场微服务的变革之旅 曾经&#xff0c;我们的系统像一个熙熙攘攘的传统菜市场。所有功能模块&#xff08;摊贩&#xff09;都挤在一个巨大的单体应用中。用户请求&#xff08;买菜的顾客&#xff09;一多&#xff0c;整个市场就拥堵不堪…

2025网络安全趋势报告 内容摘要

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

云原生安全基石:深度解析HTTPS协议(从原理到实战)

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念&#xff1a;HTTPS是什么&#xff1f; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP协议的安全版本&#xff0c…

Autodl训练Faster-RCNN网络--自己的数据集(一)

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

python打卡day36

复习日 仔细回顾一下神经网络到目前的内容&#xff0c;没跟上进度的补一下进度 作业&#xff1a;对之前的信贷项目&#xff0c;利用神经网络训练下&#xff0c;尝试用到目前的知识点让代码更加规范和美观。探索性作业&#xff08;随意完成&#xff09;&#xff1a;尝试进入nn.M…

Paimon和Hive相集成

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

HarmonyOS 鸿蒙应用开发进阶:深入理解鸿蒙跨设备互通机制

鸿蒙跨设备互通&#xff08;HarmonyOS Cross-Device Collaboration&#xff09;是鸿蒙系统分布式能力的重要体现&#xff0c;通过创新的分布式软总线技术&#xff0c;实现了设备间的高效互联与能力共享。本文将系统性地解析鸿蒙跨设备互通的技术架构、实现原理及开发实践。 跨设…

Vue.js教学第十五章:深入解析Webpack与Vue项目实战

Webpack 与 Vue 项目详解 在现代前端开发中,Webpack 作为最流行的模块打包工具之一,对于 Vue 项目的构建和优化起着至关重要的作用。本文将深入剖析 Webpack 的基本概念、在 Vue 项目中的应用场景,并详细讲解常用的 Webpack loaders 和 plugins 的配置与作用,同时通过实例…