当前位置: 首页 > news >正文

【第4章】SpringBoot实战篇之登录优化(含redis使用)

文章目录

  • 前言
  • 一、整合redis
    • 1. 引入库
    • 2. 配置
  • 二、登录优化
    • 1.登录
    • 2.拦截器
    • 3. 登出
    • 4. 修改密码
  • 总结


前言

上一章的登录接口,我们将用户登录信息放置于Map中,存在一个问题,集群部署无法共享以及应用停止用户登录信息即丢失,接下来我们整合redis来整合这个问题。


一、整合redis

1. 引入库

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2. 配置

spring:data:redis:host: 192.168.137.192port: 6379database: 0username: defaultpassword: 21797d7480c1270b848a1524128671b31dcad0725762cf41cc81c21e15fa35b2

二、登录优化

1.登录

@Autowired
StringRedisTemplate stringRedisTemplate;
@RequestMapping("login")
public Result login(@Valid User loginUser){String message="用户名/密码不正确";User user = userSerivce.findUserByName(loginUser.getUsername());if(user!=null){//用户存在if(user.getPassword().equals(Md5Util.getMD5String(loginUser.getPassword()))){//密码正确Map<String,Object> claims=new HashMap();claims.put("userId",user.getId());claims.put("username",user.getUsername());String token = JwtUtils.create(claims);stringRedisTemplate.opsForValue().set(user.getId().toString(),token,24, TimeUnit.HOURS);return Result.success("登录成功",token);}}return Result.error(message);
}

2.拦截器

@Autowired
StringRedisTemplate stringRedisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("Authorization");if(token!=null&&token.contains("Bearer")){String tokenStr = token.substring(token.indexOf("Bearer") + 7);boolean verify = JwtUtils.verify(tokenStr);if(verify){//此处解析loginUsers,验证用户已登录Map<String, Object> claims = JwtUtils.getClaims(tokenStr);if(tokenStr.equals(stringRedisTemplate.opsForValue().get(claims.get("userId").toString()))){ThreadLocalUtil.set(claims);//用户信息放置ThreadLocalreturn true;};}}response.setStatus(HttpStatus.UNAUTHORIZED.value());response.setContentType("application/json;charset=UTF-8");ObjectMapper objectMapper = new ObjectMapper();objectMapper.writerFor(Result.class);String message = objectMapper.writeValueAsString(Result.error("token验证失败,请重新获取token后重试!"));response.getWriter().println(message);return false;
}

3. 登出

@RequestMapping("logout")
public Result logout(@Valid User loginUser,@RequestHeader("Authorization") String token){String message="用户名/密码不正确";User user = userSerivce.findUserByName(loginUser.getUsername());if(user!=null){//用户存在if(token!=null&&token.contains("Bearer")){String tokenStr = token.substring(token.indexOf("Bearer") + 7);boolean verify = JwtUtils.verify(tokenStr);if(verify&&tokenStr.equals(loginInceptor.get(user.getId()))){
//                    loginInceptor.remove(user.getId());stringRedisTemplate.delete(user.getId().toString());return Result.success("登出成功");}}}return Result.error(message);
}

4. 修改密码

@PatchMapping("updatePwd")public Result updatePwd(@RequestBody Map<String,String> params){String oldPwd = params.get("old_pwd");String newPwd = params.get("new_pwd");String conPwd = params.get("con_pwd");//参数校验if(!StringUtils.hasLength(oldPwd)||!StringUtils.hasLength(newPwd)||!StringUtils.hasLength(conPwd)){return Result.error("缺少必要的参数");}if(!validPwdLen(oldPwd)||!validPwdLen(newPwd)||!validPwdLen(conPwd)){return Result.error("密码为8-20位");}//密码匹配Map<String, Object> claims =ThreadLocalUtil.get();Integer userId = (Integer) claims.get("userId");User user = userSerivce.findUserById(userId);if(!Md5Util.getMD5String(oldPwd).equals(user.getPassword())){return Result.error("密码有误");}//新密码匹配if(!newPwd.equals(conPwd)){return Result.error("两次密码不匹配");}//新旧匹配if(newPwd.equals(oldPwd)){return Result.error("新旧密码不能相同");}user.setPassword(Md5Util.getMD5String(newPwd));int i = userSerivce.UpdateUser(user);if(i!=1){return Result.success("密码修改失败");}stringRedisTemplate.delete(user.getId().toString());return Result.success("密码修改成功");}

总结

回到顶部
更多关于redis内容请参考redis系列专栏

相关文章:

【第4章】SpringBoot实战篇之登录优化(含redis使用)

文章目录 前言一、整合redis1. 引入库2. 配置 二、登录优化1.登录2.拦截器3. 登出4. 修改密码 总结 前言 上一章的登录接口,我们将用户登录信息放置于Map中,存在一个问题,集群部署无法共享以及应用停止用户登录信息即丢失,接下来我们整合redis来整合这个问题。 一、整合redis …...

数据结构:详解二叉树(树,二叉树顺序结构,堆的实现与应用,二叉树链式结构,链式二叉树的4种遍历方式)

目录 1.树的概念和结构 1.1树的概念 1.2树的相关概念 1.3树的代码表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的存储结构 2.3.1顺序存储 2.3.2链式存储 3.二叉树的顺序结构和实现 3.1二叉树的顺序结构 3.2堆的概念和结构 3.3堆的特点 3…...

HarmonyOS-9(stage模式)

配置文件 {"module": {"requestPermissions": [ //权限{"name": "ohos.permission.EXECUTE_INSIGHT_INTENT"}],"name": "entry", //模块的名称"type": "entry", //模块类型 :ability类型和…...

RestTemplate代码内部访问RESTful服务的客户端工具

1. 前言 在当今的互联网时代&#xff0c;RESTful服务已经成为了一种流行的服务架构风格&#xff0c;它提供了简单、轻量级、灵活、可扩展的方式来构建和访问Web服务。而在Java开发中&#xff0c;Spring框架提供了一个非常方便的工具——RestTemplate&#xff0c;用于访问和调用…...

Flutter 中的 SliverLayoutBuilder 小部件:全面指南

Flutter 中的 SliverLayoutBuilder 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;它提供了丰富的组件来帮助开发者构建高性能、美观的跨平台应用。在 Flutter 的滚动视图系统中&#xff0c;SliverLayoutBuilder 是一个允许开发者根据当前滚动位置…...

家政预约小程序11新增预约

目录 1 创建数据源2 创建页面3 显示选中的服务信息4 设置表单容器5 配置地图6 配置预约成功页面7 从详情页到预约页总结 用户在浏览家政小程序的具体服务时&#xff0c;如果希望预约的&#xff0c;可以在详情页点击立即预约按钮&#xff0c;填写具体的信息&#xff0c;方便家政…...

AI雷达小程序个人名片系统源码 PHP+MYSQL组合开发 带完整的安装代码包以及搭建教程

系统概述 随着移动互联网的普及和社交媒体的兴起&#xff0c;人们获取信息和建立联系的方式发生了翻天覆地的变化。传统的纸质名片已经无法满足现代人的需求&#xff0c;而小程序作为一种轻量级应用&#xff0c;具有无需安装、即开即用、易于分享等特点&#xff0c;成为了个人…...

Kafka生产者消息异步发送并返回发送信息api编写教程

1.引入依赖&#xff08;pox.xml文件&#xff09; <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.2</version> </dependency> </depende…...

WiFi串口服务器与工业路由器:局域网应用的协同之力

在工业物联网&#xff08;IIoT&#xff09;迅猛发展的当下&#xff0c;局域网&#xff08;LAN&#xff09;作为连接工业设备与数据中心的桥梁&#xff0c;其重要性日益凸显。WiFi串口服务器与工业路由器作为局域网中的关键组件&#xff0c;以其独特的性能和功能&#xff0c;为传…...

Unity功能——通过按键设置物体朝左/右旋转(含C#转xlua版)

博文简介&#xff1a; 开发场景&#xff1a;unity的3d场景&#xff1b; 功能&#xff1a;当设定的键被按下时&#xff0c;进行物体朝左/右旋转&#xff1b; 适用范围&#xff1a;本文代码适用于设置3d物体朝左右旋转&#xff0c;也适用于设置UI对象朝左右旋转&#xf…...

泛微ecology开发修炼之旅

我将多年泛微ecology开发经验&#xff0c;进行了总结&#xff0c;然后分享给大家。 泛微开发修炼之旅 泛微开发修炼之旅--01搭建开发环境 泛微开发修炼之旅--02开发接口demo 泛微开发修炼之旅--03常用数据表结构讲解 泛微开发修炼之旅--04常用数据库操作工具类封装 。。。。 我…...

PostgreSQL的视图pg_locks

PostgreSQL的视图pg_locks pg_locks 是 PostgreSQL 提供的系统视图&#xff0c;用于显示当前数据库中的锁信息。通过查询这个视图&#xff0c;数据库管理员可以监控锁的使用情况&#xff0c;识别潜在的锁争用和死锁问题&#xff0c;并优化数据库性能。 pg_locks 视图字段说明…...

元宇宙NFG结合IPO线上营销模型合理降税

在当今快速演进的互联网和区块链技术背景下&#xff0c;我们见证了从移动端购物到区块链热潮&#xff0c;再到如今市场竞争日趋激烈的变革。尤其是在2024年这个关键节点&#xff0c;许多平台为了吸引用户&#xff0c;推出了各种创新的商业模式。然而&#xff0c;如何在这样的环…...

Python打印当前目录下,所有文件名的首字母

代码如下&#xff1a; #!/usr/bin/env python3 """ 按顺序打印当前目录下&#xff0c;所有文件名的首字母&#xff08;忽略大小写&#xff09; """ import sys from pathlib import Pathdef main() -> None:ps Path(__file__).parent.glob(…...

程序员应该有什么职业素养?

程序员的六大职业素养&#xff1a;构建成功职业生涯的基石 在不断变化的技术世界中&#xff0c;程序员不单要保持技术的锋利&#xff0c;也需要培养相应的职业素养&#xff0c;这些素养在很大程度上决定了一个程序员的职业生涯能否走得长远。以下是我认为最为重要的六大职业素…...

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候&#xff0c;通常会对表的每一行&#xff0c;都会进行检查以确保列为空/不为空&#xff0c;这是符合常理的。 但是如果本身这个列上有非空&#xff08;NOT NULL&#xff09;约束&#xff0c;再次检查就会浪费资源。甚至有时候…...

Flink的简单学习二

一 Flink的核心组件 1.1 client 1.将数据流程图DataFlow发送给JobManager。 1.2 JobManager 1.收集client的DataFlow图&#xff0c;将图分解成一个个的task任务&#xff0c;并返回状态更新数据给client 2.JobManager负责作业调度&#xff0c;收集TaskManager的Heartbeat和…...

如何提高员工的工作主动性?

在现代竞争激烈的商业环境中&#xff0c;拥有高度主动性的员工是每个组织所追求的目标。主动性不仅能够促进员工的个人成长&#xff0c;还可以提升团队的效率和创新力。因此&#xff0c;如何提高员工的工作主动性成为了企业管理者需要关注的重要问题。那么如何培养和激发员工的…...

FFmpeg PCM编码为AAC

使用FFmpeg库把PCM文件编码为AAC文件&#xff0c;FFmpeg版本为4.4.2-0 代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <…...

React@16.x(16)Render Props

目录 1&#xff0c;问题描述2&#xff0c;解决方式2.1&#xff0c;Render Props2.2&#xff0c;HOC 3&#xff0c;使用场景 1&#xff0c;问题描述 当使用组件时&#xff0c;标签中的内容&#xff0c;会被当做 props.children 来渲染&#xff1a; 子组件&#xff1a; import…...

从零开始用 Python 做销量预测(保姆级教程)

一、为什么要学销量预测&#xff1f;想象你是某连锁奶茶店的运营&#xff1a;备货太少 → 顾客喝不到&#xff0c;差评 &#x1f621;备货太多 → 过期倒掉&#xff0c;亏钱 &#x1f62d;销量预测&#xff08;Sales Forecasting&#xff09;​ 就是为了解决这个“黄金平衡点”…...

在多模型聚合调用中体验到的路由与失败切换流畅度

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在多模型聚合调用中体验到的路由与失败切换流畅度 效果展示类&#xff0c;分享开发者在实际编程中&#xff0c;当配置了多个备用模…...

Runtime不是跑kernel的——它是昇腾CANN里的执行层

前言 昇腾NPU上的算子是怎么跑起来的&#xff1f;有人说"runtime就是负责跑kernel的"&#xff0c;有人说"runtime管内存分配"&#xff0c;还有人说"runtime就是CUDA runtime的对应物"。这些答案都有对的地方&#xff0c;但都没说到根子上。 Ru…...

用正点原子Nano开发板,5分钟搞定RT-Thread Nano的MDK5工程配置(附串口调试技巧)

正点原子Nano开发板极速上手RT-Thread实战指南 1. 开箱即用的开发环境搭建 刚拿到正点原子Nano开发板时&#xff0c;最令人兴奋的莫过于快速验证硬件是否正常工作。这款基于STM32F103RBT6的开发板&#xff0c;以其72MHz主频和丰富的外设资源&#xff0c;成为嵌入式入门学习的…...

SMUDebugTool深度解析:AMD Ryzen处理器硬件调试技术指南

SMUDebugTool深度解析&#xff1a;AMD Ryzen处理器硬件调试技术指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…...

Poppins几何字体:如何让拉丁文与天城体在同一个视觉世界里和谐共舞?

Poppins几何字体&#xff1a;如何让拉丁文与天城体在同一个视觉世界里和谐共舞&#xff1f; 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 当你的产品需要同时面向印度用户和全…...

魔兽争霸III终极优化指南:7大核心功能让经典游戏重获新生

魔兽争霸III终极优化指南&#xff1a;7大核心功能让经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸III》在现代电脑…...

Hermes Agent对接Taotoken自定义Provider的配置要点详解

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Hermes Agent对接Taotoken自定义Provider的配置要点详解 1. 理解对接的基本前提 Hermes Agent是一个支持多种大模型提供方的开发工…...

Agentic AI生产落地的三大核心能力:状态管理、工具编排与可观测性

1. 这不是“选框架”的指南&#xff0c;而是帮你避开2025年Agentic AI项目里最致命认知陷阱的实操手册你点开这篇内容&#xff0c;大概率不是想听“LangChain很火”“LlamaIndex适合RAG”这种教科书式罗列。你手头可能正卡在一个真实场景里&#xff1a;要给客服系统加自主决策能…...

3步快速清理Windows驱动存储:DriverStore Explorer终极使用指南

3步快速清理Windows驱动存储&#xff1a;DriverStore Explorer终极使用指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间不断减少&#xff0c;却找不到原…...