SpringBoot项目中集成Kaptcha

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());
    }
}
2.4.效果:
相关推荐
thinktik几秒前
AWS EKS 实现底层EC2计算资源的自动扩缩[AWS 中国宁夏区]
后端·aws
uhakadotcom9 分钟前
什么是OpenTelemetry?
后端·面试·github
知其然亦知其所以然16 分钟前
MySQL 社招必考题:如何优化特定类型的查询语句?
后端·mysql·面试
用户40993225021221 分钟前
给接口加新字段又不搞崩老客户端?FastAPI的多版本API靠哪三招实现?
后端·ai编程·trae
RoyLin21 分钟前
TypeScript设计模式:代理模式
前端·后端·typescript
用户6120414922131 小时前
C语言做的文本词频数量统计功能
c语言·后端·敏捷开发
IT_陈寒2 小时前
Vue3性能优化实战:这5个技巧让我的应用加载速度提升了70%
前端·人工智能·后端
在逃牛马3 小时前
【Uni-App+SSM 宠物项目实战】Day16:订单提交
后端
高松燈3 小时前
浮点数类型导致金额计算错误复盘总结
后端