首页 > 其他分享 >springboot验证码-Hutool-captcha

springboot验证码-Hutool-captcha

时间:2023-08-18 22:45:09浏览次数:27  
标签:code springboot captcha 验证码 接口 生成 Captcha Hutool

前言
在Web应用程序中,为了保护用户信息的安全性,验证码已经成为了一个非常普遍的安全措施,而Hutool-captcha是一款非常优秀的开源图形验证码工具,简单易用,提供了丰富的特性,可以帮助我们快速实现验证码功能。

本文将介绍如何使用Spring Boot整合Mybatis-Plus和Hutool-captcha实现验证码功能,并将其提供给Vue前端进行登录验证。

项目概述
在本文中,我们将使用Spring Boot作为Web应用程序的后端框架,并配合Mybatis-Plus实现数据访问层,使用Hutool-captcha实现验证码功能。

我们的目标是实现一个可重用的验证码生成接口,该接口将生成一个随机的验证码,并将其返回给客户端,客户端可以将其用于用户登录等操作的验证。

步骤1:设置项目依赖
在开始之前,首先需要在项目中添加以下依赖:

<!--Spring Boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Mybatis-Plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>VERSION</version>
</dependency>
<!--Hutool-captcha依赖-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>${hutool.version}</version>
</dependency>

步骤2:创建验证码实体
在创建验证码接口之前,我们需要先创建一个验证码实体类来存储生成的验证码。我们可以创建一个包含验证码和过期时间的Java Bean类,如下所示:

@Data
public class Captcha {
private String code; //验证码
private LocalDateTime expireTime; //过期时间

//构造函数
public Captcha(String code, long expireIn) {
this.code = code;
this.expireTime = LocalDateTime.now().plusSeconds(expireIn);
}

//判断验证码是否过期
public boolean isExpired() {
return LocalDateTime.now().isAfter(expireTime);
}
}

步骤3:创建验证码生成接口
接下来,我们需要创建一个生成验证码的接口。我们可以将验证码生成的逻辑放在一个工具类中,例如以下工具类:

@Component
public class CaptchaUtil {

@Value("${captcha.expireTime}")
private long expireTime; // 验证码过期时间

@Value("${captcha.width}")
private int width; // 验证码图片宽度

@Value("${captcha.height}")
private int height; // 验证码图片高度

@Value("${captcha.length}")
private int length; // 验证码长度

// 生成验证码
public Captcha createCode() throws IOException {
// 创建验证码图片
LineCaptcha captcha = CaptchaUtil.createLineCaptcha(width, height, length, 20);
// 生成验证码
String code = captcha.getCode();
// 保存验证码
Captcha cap = new Captcha(code, expireTime);
return cap;
}

// 校验验证码
public boolean checkCode(String userCode, Captcha cap) {
// 验证码为空
if (cap == null || cap.isExpired()) {
return false;
}
// 验证码不正确
if (!cap.getCode().equalsIgnoreCase(userCode.trim())) {
return false;
}
// 通过验证
return true;
}

}

在上面的工具类中,我们使用了Hutool-captcha来创建验证码,并将其封装到Captcha类中。同时,我们还提供了一个checkCode方法,用于比较用户输入的验证码与我们生成的验证码是否相等。

现在,我们将创建一个RestController,它将暴露生成验证码的接口,如下所示:

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

@Autowired
private CaptchaUtil captchaUtil;

@GetMapping("/get")
public R getCaptcha() throws IOException {
Captcha captcha = captchaUtil.createCode();
return R.ok(captcha);
}

}

在上面的控制器中,我们使用了CaptchaUtil工具类来生成验证码,并通过R.ok()方法将其传递给前端。请注意,R是一个响应对象,用于封装返回的数据,使用R.ok()方法返回一个成功响应。

步骤4:前端集成
最后,我们需要在前端中使用生成的验证码。我们可以在登录表单中添加一个验证码输入框和一个用于显示验证码图片的img标签。我们可以通过调用getCaptcha接口来获取验证码,将其转换为Base64编码格式,并将其作为img标签的src属性。

以下是Vue前端代码示例:

<template>
<el-form>
<el-form-item label="用户名">
<el-input v-model="form.username" />
</el-form-item>
<el-form-item label="密码">
<el-input v-model="form.password" />
</el-form-item>
<el-form-item label="验证码">
<el-input v-model="form.captcha" />
<img :src="captchaImg" @click="refreshCaptcha" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="login">登录</el-button>
</el-form-item>
</el-form>
</template>
<script>
import axios from "axios";

export default {
data() {
return {
form: {
username: "",
password: "",
captcha: "",
},
captchaImg: "",
};
},
methods: {
login() {
axios.post("/login", this.form).then((res) => {});
},
refreshCaptcha() {
axios.get("/captcha/get").then((res) => {
this.captchaImg = `data:image/jpeg;base64,${res.data.data.code}`;
});
},
},
mounted() {
this.refreshCaptcha();
},
};
</script>

在上面的代码中,我们使用了axios库来发送GET和POST请求,使用Base64编码格式将验证码显示在img标签中。在refreshCaptcha方法中,我们发送一个GET请求到getCaptcha接口,并将响应数据转换为Base64格式,然后将其作为img的src属性。

结论
在本文中,我们学习了如何使用Spring Boot、Mybatis-Plus和Hutool-captcha实现验证码生成接口,并将其提供给Vue前端进行登录验证。我们通过创建验证码实体类、生成验证码工具类和控制器,在后端实现了一个可重用的验证码生成接口。在前端,我们使用了Vue框架来调用后端接口,将验证码显示在界面上,完成了整个验证码验证流程

标签:code,springboot,captcha,验证码,接口,生成,Captcha,Hutool
From: https://www.cnblogs.com/wjsqqj/p/17641760.html

相关文章

  • springboot验证码-kaptcha谷歌验证码工具
    验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息。Maven依赖在开发验证码功能的时候,kaptcha谷歌验证码工具,依赖。<!--验证码--><dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artif......
  • springboot验证码-kaptcha,hutool-captcha
    前言在springboot的登陆页面中为了防止机器大规模注册,机器暴力破解数据密码等危害,需要验证随机生成的验证码。现提出两种简易方案生成验证码功能,一种采用springboot整合kaptcha第三方验证码生成工具的生成方案;另一种采用springboot整合第三方类库hutool生成验证码,验证成功跳转至s......
  • SpringBoot 启动流程追踪(第二篇)
    上一篇文章分析了除refresh方法外的流程,并着重分析了load方法,这篇文章就主要分析refresh方法,可以说refresh方法是springboot启动流程最重要的一环,没有之一。我们通常在分析源码的过程中,都需要带着一个目标去看,不然看这看那,感觉什么都没有看一样。这篇文章的目标在于弄懂......
  • Springboot使用Redisson作为分布式锁
    官方地址:https://github.com/redisson/redisson/wiki/Table-of-Content一些官网说明    Redisson采用了基于NIO的Netty框架,不仅能作为Redis底层驱动客户端,具备提供对Redis各种组态形式的连接功能,对Redis命令能以同步发送、异步形式发送、异步流形式发送或管道形式发送的功能......
  • Java 工具类库:Hutool使用说明
    Hutool是什么Hutool是一个Java工具包类库,它可以对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Utils工具类。Hutool即是Hu(谐音“糊涂”)+tool,前者致敬作者“前任公司”,后者为工具之意,谐音“糊涂”,寓意追求“万事都作糊涂观,无所谓失,无所谓得”的......
  • Springboot中实现观察者模式
    在SpringBoot中实现观察者模式可以通过以下步骤进行:1.定义观察者接口(Observer):创建一个接口,定义观察者对象需要实现的方法,例如update()方法。publicinterfaceObserver{voidupdate();}2.实现具体的观察者(具体实现Observer接口的类):创建一个或多个具体的观察者类,实......
  • springboot redssion 单机模式/集群模式/哨兵模式连接
    引入依赖:<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.10.7</version></dependency><dependency><groupId>......
  • SpringBoot3集成Kafka
    目录一、简介二、环境搭建1、Kafka部署2、Kafka测试3、可视化工具三、工程搭建1、工程结构2、依赖管理3、配置文件四、基础用法1、消息生产2、消息消费五、参考源码标签:Kafka3.Kafka-eagle3;一、简介Kafka是一个开源的分布式事件流平台,常被用于高性能数据管道、流分析、数据集......
  • idea导入新springboot项目时 如何进行configure相关的配置 启动项目
    idea导入springboot项目运行教程前置要求①具备Java环境,并且可以通过Maven进行安装项目依赖;②具备IntelliJIDEA工具,推荐专业版,社区版也不影响;③具备Mysql5.7或以上版本数据库;④具备Navicat数据库可视化管理工具;⑤推荐使用GoogleChrome、Firefox浏览器idea导入项目的运行教......
  • SpringBoot
    1.回顾spring的AOP:(1)什么是AOP?面向切面编程,它是对OOP的一种补充技术。把业务代码和非业务代码分离。在不改变业务代码的前提下,可以对业务代码进行增强。(2)应用场景:(1)日志(2)权限校验(3)事务处理。(3)核心的概念:​【1】切面:​[2]切点:​[3]......