Springboot和vue前后端交互实现验证码登录

ops/2024/12/18 13:56:58/

Springboot和vue前后端交互实现验证码登录

大致的思路就是:

  1. 前端发送请求到后端生成验证码图片返回给前端token,后端把验证码存在缓存中(key,value),key是token,value是验证码的值
  2. 前端拿到验证码图片渲染,并把token存在localstorage中,在发送请求前到达携带这个token
  3. 验证时,请求头中拿到token,再根据token从缓存中拿到验证码,跟前端传来的表单验证码对比

一.验证码实现流程图

在这里插入图片描述

二、后端具体实现步骤

2.1添加依赖

<!-- hutool工具包 -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version>
</dependency><!-- Caffeine缓存 -->
<dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId>
</dependency>

2.2配置缓存

@Configuration
public class CacheConfig {@Beanpublic Cache<String, String> captchaCache() {return Caffeine.newBuilder().expireAfterWrite(2, TimeUnit.MINUTES)  // 2分钟过期.maximumSize(10000).build();}
}

2.3验证码控制器

@RestController
@RequestMapping("/api")
public class CaptchaController {private static final String SESSION_KEY = "X-Captcha-Token";@Autowiredprivate Cache<String, String> captchaCache;// 生成验证码@GetMapping("/captcha")public void generateCaptcha(HttpServletResponse response) {// 生成验证码LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(100, 40);String code = lineCaptcha.getCode();// 生成token并存入缓存String token = UUID.randomUUID().toString();captchaCache.put(token, code);// 设置响应response.setHeader(SESSION_KEY, token);response.setContentType("image/png");response.setHeader("Cache-Control", "no-store, no-cache");// 输出图片try {lineCaptcha.write(response.getOutputStream());} catch (IOException e) {e.printStackTrace();}}// 登录验证@PostMapping("/login")public Result login(@RequestBody LoginDTO loginDTO, @RequestHeader(SESSION_KEY) String token) {// 验证码校验String cacheCode = captchaCache.getIfPresent(token);if (StrUtil.isEmpty(cacheCode)) {return Result.error("验证码已过期");}if (!cacheCode.equalsIgnoreCase(loginDTO.getCaptcha())) {return Result.error("验证码错误");}// 清除验证码captchaCache.invalidate(token);// 继续登录流程...}
}

2.4跨域

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);config.addAllowedOriginPattern("*");config.addAllowedHeader("*");config.addAllowedMethod("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

三.前端实现步骤

3.1验证码组件

<template><div class="captcha-wrapper"><inputv-model="form.captcha"type="text"placeholder="请输入验证码"/><img :src="captchaUrl" @click="refreshCaptcha"class="captcha-img"alt="验证码"/></div>
</template><script setup>
const SESSION_KEY = 'X-Captcha-Token'// 刷新验证码
const refreshCaptcha = async () => {const response = await fetch('/api/captcha')const token = response.headers.get(SESSION_KEY)localStorage.setItem(SESSION_KEY, token)const blob = await response.blob()captchaUrl.value = URL.createObjectURL(blob)
}
</script>

3.2axios请求配置

// request.js
import axios from 'axios'const SESSION_KEY = 'X-Captcha-Token'const request = axios.create({baseURL: '/api',timeout: 5000
})// 请求拦截器:添加token
request.interceptors.request.use(config => {const token = localStorage.getItem(SESSION_KEY)if (token) {config.headers[SESSION_KEY] = token}return config
})// 响应拦截器:清理token
request.interceptors.response.use(response => {if (response.config.url === '/api/login' && response.data.code === 200) {localStorage.removeItem(SESSION_KEY)}return response.data
})

http://www.ppmy.cn/ops/142924.html

相关文章

大数据技术与应用——数据可视化(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数据可视化 大…

【大模型】LLaMA-2:Open Foundation and Fine-Tuned Chat Models, July. 2023.

论文&#xff1a;LLaMA-2&#xff1a;Open Foundation and Fine-Tuned Chat Models, July. 2023. 链接&#xff1a;https://arxiv.org/abs/2307.09288 Introduction 创新点 7B - 70B 预训练 微调 开源Llama 2 和Llama 2-Chat&#xff0c;针对对话用例进行了优化Motivation A…

VTK知识学习(25)- 图像显示2

1、vtkImageActor 1&#xff09;概述 一个三维图像渲染 Actor&#xff0c;通过纹理映射将图像映射到一个多边形上进行显示。使用 vtkImageActor 较 vtklmageViewer2要复杂一些&#xff0c;需要建立完整的渲染管线:包括 vtklmageActor、vtkRender、vtkRenderWindow 和 vtkRende…

如何利用Python爬虫京东获得JD商品详情

在数字化时代&#xff0c;数据如同黄金般珍贵&#xff0c;而电商数据&#xff0c;尤其是像京东这样的大型电商平台上的信息&#xff0c;更是商家、市场分析师和数据科学家眼中的瑰宝。本文将带您走进Python爬虫的世界&#xff0c;探索如何高效、合法地采集京东商品数据&#xf…

《外国服务区加油站模型:功能与美观的完美结合 caotu66.com》

这个外国服务区加油站模型在设计上独具特色&#xff0c;兼具实用性和美观性。 从整体布局来看&#xff0c;加油站位于服务区的显眼位置。加油站的顶棚采用了现代风格的设计&#xff0c;顶棚的颜色主要是黄色和蓝色&#xff0c;色彩鲜明且具有辨识度。顶棚下方有多个加油柱&…

Sui 区块链 Move 语言基础:深入解析数据类型与模块概念

目录 前言Move 共学活动&#xff1a;快速上手 Move 开发一、整数类型1. Move 语言特性&#xff1a;强类型与类型安全2. 运算符3. 处理负数与小数 二、布尔类型三、地址类型1. 十六进制地址2. 命名地址 四、包和模块的概念1. 创建一个包2. 包名与配置文件一致性3. 模块名与文件名…

深度学习day4|用pytorch实现猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 &#x1f37a;要求&#xff1a; 训练过程中保存效果最好的模型参数。 加载最佳模型参数识别本地的一张图片。 调整网络结构使测试集accuracy到达88%&#x…

正则表达式的元字符(有功能的符号)

通配符 &#xff1a; . 叫通配符、万能通配符&#xff0c;匹配1个除了换行符\n以外的任意原子符号 字符集&#xff1a;[] : 只能匹配一个 例如 [a-z]匹配a到z中任何一个 # 通配符 . data "a 12 32 你好 221 a fbd facdsd c231 dda 测试 f d" # 匹配以f开头&…