基于 Spring Boot 的登录功能实现详解

在 Web 应用开发中,登录功能是保障系统安全的第一道防线。本文将结合实际代码,详细解析一个基于 Spring Boot 框架的登录功能实现,包括验证码生成、用户验证、Token 机制等关键环节。

技术栈概览

本登录功能实现涉及以下核心技术和组件:

  • Spring Boot:后端开发框架
  • MyBatis-Plus:数据库操作增强工具
  • Redis:用于存储验证码和 Token
  • JWT:生成和验证用户令牌
  • Hutool:提供 UUID 生成、加密等工具类
  • 验证码工具:生成图形验证码

核心功能实现

1. 验证码生成与验证

验证码是防止恶意登录的重要手段,实现代码如下:

@RequestMapping("/captcha")
public Result getCaptcha(){// 生成验证码图片对象Captcha captcha = new SpecCaptcha(130, 38, 4);// 将验证码转为大写字符串String code = captcha.text().toUpperCase();// 生成UUID作为验证码的唯一标识String uuid = IdUtil.simpleUUID();// 存入redis并设置2分钟过期时间redisTemplate.opsForValue().set(uuid, code, 120, TimeUnit.SECONDS);// 构建返回数据Map<String,Object> map = new HashMap<>();map.put("uuid", uuid);       // 验证码唯一标识map.put("code", code);       // 验证码文本map.put("captcha", captcha.toBase64());  // 验证码图片(base64格式)return Result.ok().put("data", map);
}

验证码实现流程:

  1. 生成指定尺寸的图形验证码
  2. 将验证码文本转为大写并与 UUID 绑定
  3. 存储到 Redis 并设置过期时间
  4. 将 UUID、验证码图片(base64 格式)返回给前端

2. 登录核心逻辑

登录功能是整个流程的核心,负责验证用户身份并生成访问令牌:

@RequestMapping("/login")
public Result login(@RequestBody LoginForm loginForm, HttpSession session){// 1. 验证验证码是否存在String uuid = loginForm.getUuid();String code = (String)redisTemplate.opsForValue().get(uuid);if(code == null){return Result.ok().put("status","验证码已过期");}// 2. 验证验证码是否正确String captcha = loginForm.getCaptcha().toUpperCase();if(!code.equals(captcha)){return Result.ok().put("status","验证码错误");}// 3. 验证用户名是否存在String username = loginForm.getUsername();QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();queryWrapper.eq("username", username);UserEntity user = userService.getOne(queryWrapper);if(user == null){return Result.ok().put("status","用户名不存在");}// 4. 验证密码是否正确(使用SHA256加密)String password = SecureUtil.sha256(loginForm.getPassword());if(!password.equals(user.getPassword())){return Result.ok().put("status","密码错误");}// 5. 将用户信息存入sessionsession.setAttribute("user", user);// 6. 生成JWT令牌String token = jwtUtil.createToken(String.valueOf(user.getUserId()));// 7. 准备返回数据Map<String,Object> map = new HashMap<>();map.put("token", token);map.put("expire", jwtUtil.getExpire());return Result.ok().put("data", map);
}

登录流程解析:

  1. 前端提交包含用户名、密码、验证码和 UUID 的登录表单
  2. 后端通过 UUID 从 Redis 获取验证码进行验证
  3. 验证通过后查询数据库检查用户名是否存在
  4. 对输入密码进行 SHA256 加密后与数据库存储的密码比对
  5. 验证成功后,将用户信息存入 session
  6. 生成 JWT 令牌并返回给前端,用于后续请求的身份验证

3. Token 验证机制

为了避免每次请求都需要重新登录,实现了基于 JWT 的 Token 验证机制:

@RequestMapping("/checkToken")
public Result checkToken(HttpServletRequest request){String token = request.getHeader("token");boolean result = jwtUtil.checkToken(token);if (result) return Result.ok().put("status","ok");else {return Result.ok().put("status", "error");}
}

Token 验证流程:

  1. 前端在请求头中携带 Token
  2. 后端从请求头获取 Token 并验证其有效性
  3. 返回验证结果,前端根据结果判断是否需要重新登录

4. 退出登录功能

@RequestMapping("/logout")
public Result logout(HttpSession session) {session.invalidate();  // 使当前session失效return Result.ok().put("status", "操作成功");
}

退出登录通过使当前 session 失效,清除用户的登录状态。

安全性考虑

  1. 密码加密:使用 SHA256 算法对密码进行加密存储,避免明文存储
  2. 验证码机制:防止机器人自动登录和暴力破解
  3. Token 过期机制:JWT 令牌有有效期,降低被盗用风险
  4. Redis 存储:验证码和 Token 都存储在 Redis 中并设置过期时间,自动清理

总结

本登录功能实现了从验证码生成、用户身份验证到 Token 发放的完整流程,结合了 Redis 和 JWT 技术,既保证了系统安全性,又提升了用户体验。在实际应用中,还可以根据需求进一步增强,如添加登录次数限制、异常登录检测等功能。

通过分层验证(验证码 -> 用户名 -> 密码)的方式,逐步过滤无效请求,既提高了安全性,也能给用户提供更明确的错误提示。

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

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

相关文章

vue+django 大模型心理学智能诊断评测系统干预治疗辅助系统、智慧心理医疗、带知识图谱

vuedjango 大模型心理学智能诊断评测系统干预治疗辅助系统、智慧心理医疗、带知识图谱文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01;编号:D003 pro基于大模型心理学问卷、智能诊断&…

【linux】企业级WEB应用服务器tomcat

一 WEB技术1.1 HTTP协议和B/S 结构操作系统有进程子系统&#xff0c;使用多进程就可以充分利用硬件资源。进程中可以多个线程&#xff0c;每一个线程可以被CPU调度执行&#xff0c;这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。客户…

【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题

【Unity优化】Unity多场景加载优化与资源释放完整指南&#xff1a;解决Additive加载卡顿、预热、卸载与内存释放问题 本文将完整梳理 Unity 中通过 SceneManager.LoadSceneAsync 使用 Additive 模式加载子场景时出现的卡顿问题&#xff0c;分析其本质&#xff0c;提出不同阶段的…

B 树与 B + 树解析与实现

一、磁盘存储优化的核心逻辑 在大规模数据处理场景中&#xff0c;磁盘 I/O 效率是性能瓶颈的核心。磁盘访问具有以下特性&#xff1a; 随机访问成本高&#xff1a;磁头寻道时间&#xff08;Seek Time&#xff09;可达毫秒级&#xff0c;相比内存访问&#xff08;纳秒级&#…

MySQL 查询相同记录并保留时间最晚的一条

要在 MySQL 中查询相同记录并仅保留时间最晚的那一条&#xff0c;你可以使用以下几种方法&#xff1a;方法一&#xff1a;使用子查询和 GROUP BY假设你的表名为 your_table&#xff0c;时间字段为 create_time&#xff0c;其他用于判断记录相同的字段为 field1, field2 等&…

在 .NET Core 5.0 中启用 Gzip 压缩 Response

在 .NET Core 5.0 中启用 Gzip 压缩 Response 在 .NET Core 5.0 (ASP.NET Core 5.0) 中启用 Gzip 压缩主要通过响应压缩中间件实现。以下是详细配置步骤&#xff1a; 1. 安装必要的 NuGet 包 首先确保已安装响应压缩包&#xff1a; dotnet add package Microsoft.AspNetCore.Re…

[Oracle] TRUNC()函数

TRUNC() 是 Oracle 中一个多功能函数&#xff0c;主要用于对数值、日期进行截断操作1.TRUNC()函数用于数值处理语法格式TRUNC(number, decimal_places)参数说明number&#xff1a;要截断的数值 decimal_places&#xff1a;保留的小数位数(可选)&#xff0c;默认为0(截断所有小数…

GPT-oss:OpenAI再次开源新模型,技术报告解读

1.简介OpenAI 发布了两款开源权重推理模型 gpt-oss-120b 与 gpt-oss-20b&#xff0c;均采用 Apache 2.0 许可&#xff0c;主打在代理工作流中执行复杂推理、调用工具&#xff08;如搜索、Python 代码执行&#xff09;并严格遵循指令。120b 为 36 层 MoE 结构&#xff0c;活跃参…

python tcp 框架

目录 python tcp 框架 asyncio websockets python tcp 框架 asyncio import asyncio import json import timeclass TCPClient:def __init__(self, host, port, heartbeat_interval10):self.host hostself.port portself.heartbeat_interval heartbeat_intervalself.read…

HTML 与 CSS:从 “认识标签” 到 “美化页面” 的入门指南

个人主页&#xff1a;♡喜欢做梦 目录 &#x1f3a0;HTML &#x1f3a1;一、什么是HTML&#xff1f; ⛲️1.定义 ⛲️2.核心特点 ⛲️3.HTML的基本结构 ⛲️4.标签的层次结构关系 &#x1f3a1;二、HTML的常用标签 &#x1f305;1.文本列表标签 标题标签&#xff1a;h…

【MATLAB 2025a】安装离线帮助文档

文章目录一、在 MATLAB 设置中安装二、从math works 网站下载ISO&#xff1a;适用于给无法联网的电脑安装或自定义路径三、startup文件说明四、重要说明&#x1f9e9;&#x1f9e9;【Matlab】最新版2025a发布&#xff0c;深色模式、Copilot编程助手上线&#xff01; 版本&#…

Linux系统编程Day8 -- Git 教程(初阶)

往期内容回顾 基于Linux系统知识的第一个程序 自动化构建工具-make/Makefile gcc/g编译及链接 Vim工具的使用 Linux常用工具&#xff08;yum与vim&#xff09; ​​​​​​ Linux系统编程Day4-- Shell与权限 回顾进度条程序的编写&#xff1a; //.h文件内容 #include<stdio…

React18 Transition特性详解

Transition 核心概念&#xff1a;Transition是一种标记非紧急任务更新的机制&#xff0c;它允许React在用户交互&#xff08;如输入&#xff09;期间保持界面的响应&#xff0c;同时准备后台更新 主要特点&#xff1a; 区分优先级&#xff1a;可以将更新分为紧急非紧急任务可中…

OpenHarmony概述与使用

1. OpenHarmony Hi3861 学习目标与任务 硬件基础知识&#xff1a;涵盖嵌入式硬件体系架构&#xff08;如 MCU 基础、硬件接口原理 &#xff09;、硬件设计流程&#xff08;原理图绘制、PCB Layout 规范 &#xff09;&#xff0c;了解常见硬件外设&#xff08;传感器、通信模…

大模型提示词工程实践:大语言模型文本转换实践

大模型文本转换 学习目标 在本课程中&#xff0c;我们将探究如何使用大语言模型来完成文本转换任务&#xff0c;例如语言翻译、拼写和语法检查、语气调整以及格式转换。 相关知识点 大模型文本转换 学习内容 1. 大模型文本转换 文本转换的核心定义与范畴 文本转换 是指通过技术…

力扣LCR024:反转链表206.反转链表双解法(经典面试题)

LCR 024. 反转链表 - 力扣&#xff08;LeetCode&#xff09;LCR 024. 反转链表 - 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a;[https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg]输入&#xff1a…

Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎

Day 6: CNN卷积神经网络 - 计算机视觉的核心引擎 📚 核心概念(5分钟理解) 什么是CNN卷积神经网络? 核心概念解释: CNN(Convolutional Neural Network): 专门处理具有网格状拓扑结构数据的深度学习模型,特别擅长图像识别 为什么需要: 传统全连接神经网络处理图像时参数量…

MacBook 本地化部署 Dify 指南

Dify 安装前的准备工作 确认系统满足最低配置要求&#xff0c;包括操作系统版本、内存、CPU 和存储空间。 检查是否已安装必要的依赖项&#xff0c;如 Python、Docker 确保网络环境稳定&#xff0c;能够访问所需的软件源或镜像仓库。 获取 Dify 安装包 https://docs.dify.ai…

疫情可视化:基孔肯雅热风险地图实战解析

> 一只白纹伊蚊的飞行半径是100米,而一套WebGIS系统能将疫情防控范围精确到每平方米。 2025年夏季,基孔肯雅热疫情在广东佛山爆发,短短一个月内感染病例占全省95%以上。这种由伊蚊传播的病毒性疾病,以**突发高热、剧烈关节痛和全身皮疹**为特征,患者关节疼痛可能持续数…

【14-模型训练细节】

训练步骤 1、指定输入和输出&#xff0c;即模型定义&#xff1b; 2、指定损失函数和成本函数&#xff1b; 3、指定训练算法&#xff0c;如梯度下降算法&#xff1b;训练细节 损失函数和成本函数用梯度下降算法训练模型 主要是求成本函数的偏导数&#xff0c;使用的是反向传播算…