1.Kaptcha简介
Kaptcha是一个流行的Java库,用于生成验证码(CAPTCHA)图片。CAPTCHA是"Completely Automated Public Turing test to tell Computers and Humans Apart"的缩写,通常用于在线表单验证以防止机器人或自动化工具的滥用,保护网站不被自动注册帐户、发送垃圾邮件等使用。
Kaptcha提供了易于使用的方法来快速集成和产生各种风格的验证码图片,它支持自定义字体、文字颜色、大小以及添加的噪声等级等,从而使得验证码看起来多种多样并且对机器具有一定的识别难度。它在Spring框架中也非常容易整合。
2.SpringBoot项目中引入Kaptcha
2.1.引入依赖
<!-- Kaptcha 生成随机字符、生成图片(生成用于验证码)-->
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.0.0-beta-2</version>
</dependency>
2.2.配置工具类
package com.duhong.util;
import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
@Component
public class KaptchaProducerUtil {
@Autowired
private Producer producer;
public String createText(){
return producer.createText();
}
public BufferedImage createImage(String text){
// 生成初始图像
BufferedImage captchaImage = producer.createImage(text);
//获取图像的画笔以便添加干扰线
Graphics2D g2d = captchaImage.createGraphics();
//设置干扰线的颜色
g2d.setColor(Color.PINK); // 或者你可以使用其他颜色
//设置干扰线的笔触,使线条更粗
g2d.setStroke(new BasicStroke(3)); // 2 是线条的宽度
//随机生成干扰线的起点和终点坐标
Random random = new Random();
int x1 = random.nextInt(captchaImage.getWidth());
int y1 = random.nextInt(captchaImage.getHeight());
int x2 = random.nextInt(captchaImage.getWidth());
int y2 = random.nextInt(captchaImage.getHeight());
//在图像上绘制线条
g2d.drawLine(x1, y1, x2, y2);
//绘制3条线条
for (int i = 0; i < 3; i++) {
x1 = random.nextInt(captchaImage.getWidth());
y1 = random.nextInt(captchaImage.getHeight());
x2 = random.nextInt(captchaImage.getWidth());
y2 = random.nextInt(captchaImage.getHeight());
g2d.drawLine(x1, y1, x2, y2);
}
// 释放画笔资源
g2d.dispose();
return captchaImage;
}
}
2.3.测试:
@Test
void kaptchaTest(){
String text=producer.createText();
BufferedImage image = producer.createImage(text);
File outputFile = new File("C:\\Users\\bumiexiguang\\OneDrive\\桌面\\毕业设计\\output.png"); // 输出文件路径和名称
try {
ImageIO.write(image, "png", outputFile);
System.out.println("Image saved successfully.");
} catch (IOException e) {
System.out.println("Error saving image: " + e.getMessage());
}
}