Spring Boot 3登录开发进阶:图形验证码接口的实现

内容简介

上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。

前置条件

本文衔接上文,请从上文开始

spring boot3登录开发(整合jwt)_springboot3 jwt-CSDN博客

图形验证码接口实现

1、导入工具依赖

pom.xml:

<dependency>  <groupId>com.github.penggle</groupId>  <artifactId>kaptcha</artifactId>  <version>最新版本</version>  
</dependency>

注意:请替换最新版本为实际可用的最新版本号。

2、配置Kaptcha

创建一个配置类来配置Kaptcha。这通常包括设置验证码的文本长度、字体、颜色、图片大小等属性,在Spring Boot的配置类中添加Kaptcha的配置。

import com.google.code.kaptcha.impl.DefaultKaptcha;  
import com.google.code.kaptcha.util.Config;  
import java.util.Properties;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  @Configuration  
public class KaptchaConfig {  @Bean  public DefaultKaptcha getDefaultKaptcha() {  DefaultKaptcha defaultKaptcha = new DefaultKaptcha();  Properties properties = new Properties();  // 设置验证码的长度  properties.setProperty("kaptcha.textproducer.char.length", "4");  // 设置字体  properties.setProperty("kaptcha.textproducer.font.names", "宋体");  // 字体大小  properties.setProperty("kaptcha.textproducer.font.size", "30");  // 字体颜色  properties.setProperty("kaptcha.textproducer.font.color", "black");  // 设置图片宽度  properties.setProperty("kaptcha.image.width", "125");  // 设置图片高度  properties.setProperty("kaptcha.image.height", "45");  // 设置背景色  properties.setProperty("kaptcha.background.clear.to.white", "true");  // 设置是否有边框  properties.setProperty("kaptcha.border", "yes");  // 边框颜色  properties.setProperty("kaptcha.border.color", "105,179,90");  // 验证码图片样式  Config config = new Config(properties);  defaultKaptcha.setConfig(config);  return defaultKaptcha;  }  
}

3、 创建验证码生成服务

这里用到了redis,需要整合好:Spring Boot与Redis深度整合:实战指南

import com.google.code.kaptcha.impl.DefaultKaptcha;  
import com.google.code.kaptcha.util.Config;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.data.redis.core.StringRedisTemplate;  
import org.springframework.stereotype.Service;  import javax.imageio.ImageIO;  
import javax.servlet.ServletOutputStream;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import java.awt.image.BufferedImage;  
import java.io.ByteArrayOutputStream;  
import java.util.Properties;  @Service  
public class CaptchaService {  private DefaultKaptcha defaultKaptcha;  @Autowired  private StringRedisTemplate redisTemplate;  public CaptchaService() {  defaultKaptcha = new DefaultKaptcha();  Properties properties = new Properties();  // 设置验证码相关属性,如字体、大小、颜色等  properties.setProperty("kaptcha.border", "yes");  properties.setProperty("kaptcha.border.color", "105,179,90");  // ... 其他属性设置  Config config = new Config(properties);  defaultKaptcha.setConfig(config);  }  public void createCaptcha(HttpServletRequest request, HttpServletResponse response) throws Exception {  String captchaText = defaultKaptcha.createText();  String key = UUID.randomUUID().toString(); // 生成唯一的key  redisTemplate.opsForValue().set(key, captchaText, 60, TimeUnit.SECONDS); // 将验证码保存到Redis,并设置过期时间  request.getSession().setAttribute("captchaKey", key); // 将key保存到session中,用于前端验证  BufferedImage image = defaultKaptcha.createImage(captchaText);  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  ImageIO.write(image, "jpg", byteArrayOutputStream);  byte[] captchaImage = byteArrayOutputStream.toByteArray();  response.setDateHeader("Expires", 0);  response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");  response.addHeader("Cache-Control", "post-check=0, pre-check=0");  response.setHeader("Pragma", "no-cache");  response.setContentType("image/jpeg");  ServletOutputStream out = response.getOutputStream();  out.write(captchaImage);  out.flush();  out.close();  }  
}

4.、创建验证码控制器

在控制器中创建一个接口,创建一个控制器来处理验证码的生成请求。该接口通常是一个HTTP GET请求,返回验证码图片。

import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  @RestController  
public class CaptchaController {  @Autowired  private CaptchaService captchaService;  @GetMapping("/captcha")  public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws Exception {  captchaService.createCaptcha(request, response);  }  
}

5.、前端(Vue)

1. 安装Axios(如果尚未安装)

使用npm或yarn安装Axios,以便进行HTTP请求。

npm install axios --save

或者

yarn add axios
 2. 在Vue组件中请求验证
<template>  <div>  <img :src="captchaSrc" @click="refreshCaptcha" alt="验证码" />  <input type="text" v-model="captchaInput" placeholder="请输入验证码" />  <button @click="submitForm">提交</button>  </div>  
</template>  <script>  
import axios from 'axios';  export default {  data() {  return {  captchaSrc: '',  captchaInput: '',  };  },  methods: {  refreshCaptcha() {  this.getCaptcha();  },  getCaptcha() {  axios.get('/captcha')  .then(response => {  this.captchaSrc = window.URL.createObjectURL(new Blob([response.data]));  })  .catch(error => {  console.error(error);  });  },  submitForm() {  // 提交表单逻辑,包括验证captchaInput是否正确  // ...  },  },  mounted() {  this.getCaptcha();  },  
};  
</script>

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

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

相关文章

开发日志2024-04-11

开发日志2024/04/11 1、会员/普通用户预约完成后&#xff0c;技师对应的积分添加预约完成的项目价格添加到统计表的业绩字段中&#xff0c;同时对应的服务次数字段1 实现代码&#xff1a; 前端 shHandler(){this.$confirm(确定操作?, "提示", {confirmButtonText…

HarmonyOS实战开发-拼图、如何实现获取图片,以及图片裁剪分割的功能。

介绍 该示例通过ohos.multimedia.image和ohos.multimedia.mediaLibrary接口实现获取图片&#xff0c;以及图片裁剪分割的功能。 效果预览 使用说明&#xff1a; 使用预置相机拍照后启动应用&#xff0c;应用首页会读取设备内的图片文件并展示获取到的第一个图片&#xff0c;…

go的option模式

go的option模式 1.函数option 把option定义为函数。 package mainimport "fmt"// ServerConfig 定义服务器配置 type ServerConfig struct {Port intTimeout int }// Option 定义函数选项类型 type Option func(*ServerConfig)// WithPort 设置服务器端口 // 这…

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段&#xff0c;设置固定值行距。如果是宋体&#xff0c;小四&#xff0c;1.25行距&#xff0c;那么固定值就为20磅。 成功解决。

ELK 企业级日志分析 ELFK

一 ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源 工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 1 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引擎的…

微服务支持平台--限流算法

微服务支持平台–限流 限流算法 限流算法&#xff1a; 算法含义备注令牌桶以恒定速度往一个桶内增加令牌&#xff0c;当桶内令牌满了后&#xff0c;就停止增加令牌适用于流量比较平稳的情况&#xff0c;只能承受小的突发流量滑动窗口将时间周期分为N个小周期&#xff0c;分别记…

Java后端基础知识(String类型)

String类的创建方式 String的特点 1.引用数据类型 2.是final类&#xff0c;一旦创建内容不可修改 3.String类对象相等的判断用equals&#xff08;&#xff09;方法完成&#xff0c;是判断地址数值 String的创建方式 1.直接创建 String str"hello";注意&#xff…

Android进程类型及优先级(前台进程/可见进程/服务进程/缓存进程/空进程)

Android进程类型及优先级 一、Android 进程优先级 Android 进程优先级 :前台进程 > 可见进程 >服务进程 >缓存进程 > 空进程 ; 关键优先级进程 : 活动进程 ;高优先级进程 : 可见进程 , 服务进程 ;低优先级进程 : 后台进程 , 空进程 ; Android 系统中会尽量保证…

09 Php学习:数组和排序

数组概念 在PHP中&#xff0c;数组是一种复合数据类型&#xff0c;用于存储多个值。以下是关于PHP数组的详细解释&#xff1a; 索引数组&#xff1a;索引数组是最基本的数组类型&#xff0c;其中每个元素都有一个唯一的数字索引&#xff0c;从0开始递增。 关联数组&#xff…

Android Studio开发学习(七)———RelativeLayout(相对布局)

在上期中我们对LinearLayout进行了详细的解析&#xff0c;LinearLayout也是我们用的比较多的一个布局,更多的时候更钟情于它的 weight(权重) 属性&#xff0c;等比例划分&#xff0c;对屏幕适配还是 帮助蛮大的;但是使用LinearLayout的时候也有一个问题&#xff0c;就是当界面比…

【蓝桥杯每日一题】4.11 更小的数(不用区间DP)

题目来源&#xff1a; 蓝桥杯 2023 省 A]更小的数 - 洛谷 这题只需要用到双指针就OK~ 思路1&#xff1a; 翻转数组的子数组&#xff0c;然后进行比较大小将翻转后的数组存储在字符串 k k k中&#xff0c;然后将字符串 k k k与字符串 a a a进行逐一元素比较&#xff08;因为…

橘子学JDK之JMH-02(BenchmarkModes)

一、案例二代码 这次我们来搞一下官网文档的第二个案例&#xff0c;我删除了一些没用的注释&#xff0c;然后对代码做了一下注释的翻译&#xff0c;可以看一下意思。 package com.levi;import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import …

MySQL优化常见面试题

文章目录 1.在MySQL中如何定位慢查询2.SQL语句执行很慢&#xff0c;如何分析3.什么是索引4.索引的底层结构了解过嘛5.B树和B树的区别是什么6.什么是聚簇索引什么是非聚簇索引7.什么是回表查询8.什么是覆盖索引9.MySQL超大分页如何处理10.索引创建原则有哪些11.什么情况下索引会…

【算法练习】29:插入排序学习笔记

一、插入排序的算法思想 原理&#xff1a;将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。 时间复杂度&#xff1a;插入排序的时间复杂度在最坏、平均和最好情况下的表现相同&#xff0c;均为 &#xff0c;其中 n 是待排序数…

极狐GitLab对接OAuth2实现SSO

本文作者&#xff1a;极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时&#xff0c;页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色&#xff0c;更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称&#xff0c;有助于读者在翻阅过程中迅速定位所…

Java - 赋值运算符

在这个实战中&#xff0c;我们将学习赋值运算符的使用方法。首先&#xff0c;我们将介绍简单赋值运算符的基本概念和语法格式。然后&#xff0c;我们将通过案例演示来加深对赋值运算符的理解。接下来&#xff0c;我们将对比Java和Python这两种不同的编程语言&#xff0c;探讨它…

spring rest

controller 类的注解 Controller RequestMapping(“/api/ads”)类的方法的注解 ResponseBody GetMapping(“/postAds/{ad_id}”) - 查 PostMapping() - 增 PutMapping() - 改 DeleteMapping() PatchMapping()类的方法的参数的注解 PathVariable() RequestBody() RequestParam()…

移动端网络库行业动态-整理

欢迎各位同行补充。 阿里&#xff1a; 2023.12 淘宝移动端统一网络库的架构演进和弱网优化技术实践 http://www.52im.net/thread-4470-1-1.html 网易&#xff1a; cronet 多端统一&#xff0c;2021.11 网易云音乐网络库跨平台化实践&#xff1a;https://segmentfault.com/a/1…

电能质量管理解决方案探讨 安科瑞 许敏

电能质量在线监测装置 本办法对发电企业&#xff08;包括分布式电源&#xff09;、电网企业、用电企业的电能质量管理均有明确要求&#xff0c;要求在发电企业并网点、电网企业非线性设施、用电企业公共连接点设置电能质量监测装置&#xff0c;这会促进市场对电能质量在线监测…