使用 Kaptcha 生成验证码图片

验证码(Captcha)作为一种防止恶意攻击的技术,广泛应用于各种网络应用中。本文将介绍如何在 Spring Boot 项目中使用 Kaptcha 生成验证码图片,并演示如何自定义验证码的内容、字体、扭曲程度等设置。此外,还将介绍 Kaptcha 的 Constants 类及其使用。

一、什么是 Kaptcha

Kaptcha 是一个轻量级的 Java 库,能够生成各种类型的验证码图片,广泛应用于 Web 系统中。它可以生成包含干扰线、扭曲效果、噪声点等的验证码图像,增强了防破解能力。

二、集成 Kaptcha 到 Spring Boot 项目

首先,确保你的 Spring Boot 项目已经正确配置了 Kaptcha 的依赖。
1. 添加 Maven 依赖
在 pom.xml 中添加 Kaptcha 依赖:
<dependencies>
    <!-- Kaptcha 依赖 -->
    <dependency>
        <groupId>com.github.penggle</groupId>
        <artifactId>kaptcha</artifactId>
        <version>2.3.2</version>
    </dependency>
</dependencies>

2. 配置 Kaptcha
在 Spring Boot 项目中,你可以通过配置类来初始化 Kaptcha。我们通过 @Configuration 注解创建配置类,并使用 Kaptcha 类来设置相关的生成规则。
import com.google.code.kaptcha.Constants;
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;

@Configuration
public class KaptchaConfig {

    @Bean
    public DefaultKaptcha defaultKaptcha() {
        Properties properties = new Properties();
        
        // 设置验证码图片的宽度
        properties.put(Constants.KAPTCHA_IMAGE_WIDTH, "200");

        // 设置验证码图片的高度
        properties.put(Constants.KAPTCHA_IMAGE_HEIGHT, "50");

        // 设置验证码文本字体的大小
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_FONT_SIZE, "40");

        // 设置验证码文本字体的颜色
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_FONT_COLOR, "blue");

        // 设置验证码字符之间的间距
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_CHAR_SPACE, "5");

        // 设置验证码文本的字符数
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_CHAR_LENGTH, "4");

        // 设置验证码使用的字体
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_FONT_NAMES, "Arial,Courier");

        // 设置验证码的噪声类型
        properties.put(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");

        // 设置验证码的扭曲效果
        properties.put(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.WobbleDistort");

        // 设置验证码背景的起始颜色
        properties.put(Constants.KAPTCHA_BACKGROUND_CLEAR_FROM, "white");

        // 设置验证码背景的结束颜色
        properties.put(Constants.KAPTCHA_BACKGROUND_CLEAR_TO, "lightgray");

        // 使用 Config 创建 Kaptcha 实例
        Config config = new Config(properties);
        
        // 创建 DefaultKaptcha 实例
        DefaultKaptcha kaptcha = new DefaultKaptcha();
        
        // 设置 Kaptcha 配置
        kaptcha.setConfig(config);
        
        return kaptcha;
    }
}

三、Kaptcha 的 Constants 类

Kaptcha 的 Constants 类是一个包含许多常量的类,用来管理验证码生成过程中所涉及的一些常用配置项。通过使用 Constants 类,我们可以避免硬编码,提升代码的可维护性。
Constants 类常见常量
Kaptcha 的 Constants 类中包含了很多预定义的常量。通过引用这些常量,能够使配置更加规范并减少错误。常见的常量有:
  • Kaptcha.CAPTCHA_IMAGE_WIDTH:图片的宽度
  • Kaptcha.CAPTCHA_IMAGE_HEIGHT:图片的高度
  • Kaptcha.CAPTCHA_TEXT_PRODUCER_FONT_SIZE:字体大小
  • Kaptcha.CAPTCHA_TEXT_PRODUCER_FONT_COLOR:字体颜色
  • Kaptcha.CAPTCHA_TEXT_PRODUCER_CHAR_SPACE:字符之间的间距
  • Kaptcha.CAPTCHA_TEXT_PRODUCER_CHAR_LENGTH:验证码长度
  • Kaptcha.CAPTCHA_NOISE_IMPL:噪声类型
  • Kaptcha.CAPTCHA_OBSCURIFICATOR_IMPL:扭曲效果
通过使用这些常量配置,我们不仅避免了硬编码,还能统一管理和调整验证码的设置,提升代码的可维护性和可读性。
使用 Constants 类配置
我们可以通过 Constants 类来引用这些常量,而不是手动设置字符串常量,这样既避免了硬编码,又提高了可读性。例如:
import com.google.code.kaptcha.Constants;
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;

@Configuration
public class KaptchaConfig {

    @Bean
    public DefaultKaptcha defaultKaptcha() {
        Properties properties = new Properties();
        
        // 使用 Constants 类提供的常量来配置验证码
        properties.put(Constants.KAPTCHA_IMAGE_WIDTH, "200");
        properties.put(Constants.KAPTCHA_IMAGE_HEIGHT, "50");
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_FONT_SIZE, "40");
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_FONT_COLOR, "blue");
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_CHAR_SPACE, "5");
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_CHAR_LENGTH, "4");
        properties.put(Constants.KAPTCHA_TEXT_PRODUCER_FONT_NAMES, "Arial,Courier");
        properties.put(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
        properties.put(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.WobbleDistort");
        properties.put(Constants.KAPTCHA_BACKGROUND_CLEAR_FROM, "white");
        properties.put(Constants.KAPTCHA_BACKGROUND_CLEAR_TO, "lightgray");

        // 使用 Config 创建 Kaptcha 实例
        Config config = new Config(properties);
        
        // 创建 DefaultKaptcha 实例
        DefaultKaptcha kaptcha = new DefaultKaptcha();
        
        // 设置 Kaptcha 配置
        kaptcha.setConfig(config);
        
        return kaptcha;
    }
}

四、如何生成验证码

一旦完成配置,你就可以在 Spring Boot 控制器中使用 Kaptcha 生成验证码图片了。以下是一个简单的实现示例:
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;

@Controller
public class KaptchaController {

    @Autowired
    private DefaultKaptcha defaultKaptcha;

    @GetMapping("/kaptcha")
    public void getKaptchaImage(HttpServletResponse response) throws IOException {
        // 生成验证码文本
        String text = defaultKaptcha.createText();
        
        // 将验证码文本保存到 session 中,便于后续验证
        // 这里你可以替换成 Redis 或其他存储方式
        response.getSession().setAttribute("kaptcha", text);

        // 生成验证码图片
        BufferedImage image = defaultKaptcha.createImage(text);

        // 设置响应头为图片类型
        response.setContentType("image/png");

        // 将图片输出到响应流中
        javax.imageio.ImageIO.write(image, "png", response.getOutputStream());
    }
}

五、验证码图片的自定义

Kaptcha 提供了丰富的配置选项来定制生成的验证码图片。以下是一些常见的自定义选项:
1. 图片尺寸
你可以设置验证码图片的宽度和高度:
kaptcha.image.width=200 kaptcha.image.height=50
2. 文本属性
你可以配置验证码的字体、大小、颜色等属性:
kaptcha.textproducer.font.size=40 
kaptcha.textproducer.font.color=blue 
kaptcha.textproducer.char.space=5 
kaptcha.textproducer.font.names=Arial,Courier
3. 字符个数
可以通过以下属性设置验证码中的字符个数:
kaptcha.textproducer.char.length=4
4. 扭曲效果
验证码图片的扭曲程度可以通过 obscurificator.impl 属性来调整:
kaptcha.obscurificator.impl=com.google.code.kaptcha.impl.WobbleDistort
Kaptcha 支持多种扭曲效果,如 WobbleDistort(波动扭曲)、ShearDistort(剪切扭曲)等。
5. 背景噪声
Kaptcha 可以添加背景噪声,增加验证码的辨识难度:
kaptcha.noise.impl=com.google.code.kaptcha.impl.NoNoise
可以选择不同类型的噪声实现,如 NoNoise(无噪声)、DotNoise(点噪声)等。

六、生成验证码并进行验证

为了验证用户输入的验证码,你可以从 session 中获取验证码文本并进行比对:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

@Controller
public class KaptchaVerificationController {

    @PostMapping("/verifyCaptcha")
    public String verifyCaptcha(@RequestParam("captchaInput") String captchaInput, HttpSession session) {
        // 从 session 中获取存储的验证码
        String sessionCaptcha = (String) session.getAttribute("captcha");

        // 如果验证码匹配,返回成功页面,否则返回错误页面
        if (sessionCaptcha != null && sessionCaptcha.equalsIgnoreCase(captchaInput)) {
            return "verificationSuccess";  // 验证成功
        } else {
            return "verificationFailed";  // 验证失败
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值