SpringBoot中使用kaptcha生成验证码
简介
kaptcha是谷歌开源的简单实用的验证码生成工具。通过设置参数,可以自定义验证码大小、颜色、显示的字符等等。
Maven引入依赖
<!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha -->
<dependency>
<groupId>pro.fessional</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.3</version>
</dependency>
新增配置类
- CaptchaConfig.java
package com.example.learn.config;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
import static com.google.code.kaptcha.Constants.*;
@Configuration
public class CaptchaConfig {
@Bean(name = "captchaProducer")
public DefaultKaptcha getKaptchaBean()
{
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否有边框 默认为true 我们可以自己设置yes,no
properties.setProperty(KAPTCHA_BORDER, "yes");
// 验证码文本字符颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
// 验证码图片宽度 默认为200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 验证码图片高度 默认为50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 验证码文本字符大小 默认为40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
// 验证码文本字符长度 默认为5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
@Bean(name = "captchaProducerMath")
public DefaultKaptcha getKaptchaBeanMath()
{
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否有边框 默认为true 我们可以自己设置yes,no
properties.setProperty(KAPTCHA_BORDER, "yes");
// 边框颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
// 验证码文本字符颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
// 验证码图片宽度 默认为200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 验证码图片高度 默认为50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 验证码文本字符大小 默认为40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
// 验证码文本生成器 【这个要修改为自己项目的包路径】
properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.example.learn.config.KaptchaTextCreator");
// 验证码文本字符间距 默认为2
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
// 验证码文本字符长度 默认为5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 验证码噪点颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
// 干扰实现类
properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
- KaptchaTextCreator
package com.example.learn.config;
import com.google.code.kaptcha.text.impl.DefaultTextCreator;
import java.util.Random;
/**
* 验证码文本生成器
*
* @author ruoyi
*/
public class KaptchaTextCreator extends DefaultTextCreator
{
private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");
@Override
public String getText()
{
Integer result = 0;
Random random = new Random();
int x = random.nextInt(10);
int y = random.nextInt(10);
StringBuilder suChinese = new StringBuilder();
int randomoperands = random.nextInt(3);
if (randomoperands == 0)
{
result = x * y;
suChinese.append(CNUMBERS[x]);
suChinese.append("*");
suChinese.append(CNUMBERS[y]);
}
else if (randomoperands == 1)
{
if ((x != 0) && y % x == 0)
{
result = y / x;
suChinese.append(CNUMBERS[y]);
suChinese.append("/");
suChinese.append(CNUMBERS[x]);
}
else
{
result = x + y;
suChinese.append(CNUMBERS[x]);
suChinese.append("+");
suChinese.append(CNUMBERS[y]);
}
}
else
{
if (x >= y)
{
result = x - y;
suChinese.append(CNUMBERS[x]);
suChinese.append("-");
suChinese.append(CNUMBERS[y]);
}
else
{
result = y - x;
suChinese.append(CNUMBERS[y]);
suChinese.append("-");
suChinese.append(CNUMBERS[x]);
}
}
suChinese.append("=?@" + result);
return suChinese.toString();
}
}
简单使用
后端控制器
- CaptchaController
package com.example.learn.controller;
import cn.hutool.core.util.IdUtil;
import com.example.learn.common.returns.CommonResult;
import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.concurrent.TimeUnit;
/**
* 验证码操作处理
*/
@RestController
public class CaptchaController {
@Resource(name = "captchaProducer")
private Producer captchaProducer;
@Resource(name = "captchaProducerMath")
private Producer captchaProducerMath;
/* @Autowired
private StringRedisTemplate redisTemplate;*/
// 验证码类型可以是char/math
public static String CAPTCHA_TYPE = "char";
public static String CAPTCHA_KEY_PREFIX = "captcha:";
@GetMapping(value = "/captchaImage")
public CommonResult captchaImage() {
String capStr = null;
String code = null;
BufferedImage image = null;
if ("math".equals(CAPTCHA_TYPE)) {
// 1+2=?@3
String capText = captchaProducerMath.createText();
capStr = capText.substring(0, capText.lastIndexOf("@"));
code = capText.substring(capText.lastIndexOf("@") + 1);
image = captchaProducerMath.createImage(capStr);
} else if ("char".equals(CAPTCHA_TYPE)) {
capStr = code = captchaProducer.createText();
image = captchaProducer.createImage(capStr);
}
// 转换流信息写出
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
ImageIO.write(image,"jpg",os);
} catch (IOException e) {
return CommonResult.error(e.getMessage());
}
// 若用到了redis,放开下面注释代码,并且联调时前端需要把返回的uuid传回来
String uuid = IdUtil.simpleUUID();
/*String captchaKey = CAPTCHA_KEY_PREFIX + uuid;
// 将code到redis中
redisTemplate.opsForValue().set(captchaKey,code,2, TimeUnit.MINUTES);*/
CommonResult commonResult = CommonResult.success();
commonResult.put("uuid",uuid);
commonResult.put("img", Base64.getEncoder().encodeToString(os.toByteArray()));
return commonResult;
}
}
前端页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>显示 Base64 图片</title>
<style>
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.image-container {
margin-top: 20px;
text-align: center;
}
img {
max-width: 100%;
height: auto;
border: 1px solid #ddd;
border-radius: 4px;
}
</style>
</head>
<body>
<div class="container">
<h1>显示 Base64 图片</h1>
<div class="image-container">
<img id="base64Image" src="" alt="Base64 图片">
</div>
<button onclick="loadImage()">加载图片</button>
</div>
<script>
// 模拟从后端获取的 Base64 数据
function getBase64ImageData() {
// 这里是一个示例的 Base64 图片数据(一个简单的 PNG 图片)
return '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';
}
// 加载图片
function loadImage() {
const base64Data = getBase64ImageData();
const img = document.getElementById('base64Image');
img.src = 'data:image/jpg;base64,' + base64Data;
}
// 页面加载时直接显示图片
window.onload = function() {
loadImage();
};
</script>
</body>
</html>
说明: 将后端接口返回的img的值复制到前端页面的 function getBase64ImageData()中
效果:
- 验证码类型:math
- 验证码类型:char
其他相关代码
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>learn</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>learn</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.5.15</spring-boot.version>
<spring-framework.version>5.3.39</spring-framework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha -->
<dependency>
<groupId>pro.fessional</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.36</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- 覆盖SpringFramework的依赖配置-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring-framework.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.learn.LearnApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
- CommonResult.java
package com.example.learn.common.returns;
import java.util.HashMap;
import java.util.Objects;
public class CommonResult extends HashMap<String, Object> {
// 状态码
public static final String CODE_TAG = "code";
// 返回内容
public static final String MSG_TAG = "msg";
// 数据对象
public static final String DATA_TAG = "data";
/**
* 初始化一个新创建的 CommonResult 对象,使其表示一个空消息。
*/
public CommonResult() {
}
/**
* 初始化一个新创建的 CommonResult 对象
* @param code 状态码
* @param msg 返回内容
*/
public CommonResult(int code, String msg) {
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
}
/**
* 初始化一个新创建的 CommonResult 对象
*
* @param code 状态码
* @param msg 返回内容
* @param data 数据对象
*/
public CommonResult(int code, String msg, Object data)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
super.put(DATA_TAG, data);
}
/**
* 返回成功消息
*
* @return 成功消息
*/
public static CommonResult success()
{
return CommonResult.success("操作成功");
}
/**
* 返回成功数据
*
* @return 成功消息
*/
public static CommonResult success(Object data)
{
return CommonResult.success("操作成功", data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static CommonResult success(String msg)
{
return CommonResult.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static CommonResult success(String msg, Object data)
{
return new CommonResult(HttpStatus.SUCCESS, msg, data);
}
/**
* 返回警告消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static CommonResult warn(String msg)
{
return CommonResult.warn(msg, null);
}
/**
* 返回警告消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static CommonResult warn(String msg, Object data)
{
return new CommonResult(HttpStatus.WARN, msg, data);
}
/**
* 返回错误消息
*
* @return 错误消息
*/
public static CommonResult error()
{
return CommonResult.error("操作失败");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 错误消息
*/
public static CommonResult error(String msg)
{
return CommonResult.error(msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 错误消息
*/
public static CommonResult error(String msg, Object data)
{
return new CommonResult(HttpStatus.ERROR, msg, data);
}
/**
* 返回错误消息
*
* @param code 状态码
* @param msg 返回内容
* @return 错误消息
*/
public static CommonResult error(int code, String msg)
{
return new CommonResult(code, msg, null);
}
/**
* 是否为成功消息
*
* @return 结果
*/
public boolean isSuccess()
{
return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG));
}
/**
* 是否为警告消息
*
* @return 结果
*/
public boolean isWarn()
{
return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG));
}
/**
* 是否为错误消息
*
* @return 结果
*/
public boolean isError()
{
return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG));
}
/**
* 方便链式调用
*
* @param key 键
* @param value 值
* @return 数据对象
*/
@Override
public CommonResult put(String key, Object value)
{
super.put(key, value);
return this;
}
}
- HttpStatus.java
package com.example.learn.common.returns;
/**
* 返回状态码
*
* @author ruoyi
*/
public class HttpStatus
{
/**
* 操作成功
*/
public static final int SUCCESS = 200;
/**
* 对象创建成功
*/
public static final int CREATED = 201;
/**
* 请求已经被接受
*/
public static final int ACCEPTED = 202;
/**
* 操作已经执行成功,但是没有返回数据
*/
public static final int NO_CONTENT = 204;
/**
* 资源已被移除
*/
public static final int MOVED_PERM = 301;
/**
* 重定向
*/
public static final int SEE_OTHER = 303;
/**
* 资源没有被修改
*/
public static final int NOT_MODIFIED = 304;
/**
* 参数列表错误(缺少,格式不匹配)
*/
public static final int BAD_REQUEST = 400;
/**
* 未授权
*/
public static final int UNAUTHORIZED = 401;
/**
* 访问受限,授权过期
*/
public static final int FORBIDDEN = 403;
/**
* 资源,服务未找到
*/
public static final int NOT_FOUND = 404;
/**
* 不允许的http方法
*/
public static final int BAD_METHOD = 405;
/**
* 资源冲突,或者资源被锁
*/
public static final int CONFLICT = 409;
/**
* 不支持的数据,媒体类型
*/
public static final int UNSUPPORTED_TYPE = 415;
/**
* 系统内部错误
*/
public static final int ERROR = 500;
/**
* 接口未实现
*/
public static final int NOT_IMPLEMENTED = 501;
/**
* 系统警告消息
*/
public static final int WARN = 601;
}
参考
- kaptcha验证码组件
- RuoYi-Vue-v3.8.9