使用 Spring Boot 添加验证码功能

在现代 web 应用中,验证码是一种有效的防止恶意攻击和垃圾信息的方式。验证码可以帮助确认用户是真实的,而非机器人程序。本文将介绍如何在 Spring Boot 应用中实现验证码功能,并带有详细的代码示例。

1. 项目结构

在开始之前,我们先来看一下项目的基本结构:

spring-boot-captcha
│
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── captcha
│   │   │               ├── CaptchaApplication.java
│   │   │               ├── controller
│   │   │               │   └── CaptchaController.java
│   │   │               └── service
│   │   │                   └── CaptchaService.java
│   │   └── resources
│   │       └── application.properties
└── pom.xml

2. 添加依赖

pom.xml 文件中,添加所需的依赖。我们将使用 kaptcha 库来生成验证码。

<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

3. 创建验证码服务

我们需要创建一个服务来生成和保存验证码。下面是 CaptchaService.java 的实现:

package com.example.captcha.service;

import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;

@Service
public class CaptchaService {

    @Autowired
    private Producer captchaProducer;

    public String createCaptcha() throws IOException {
        String captchaText = captchaProducer.createText();
        BufferedImage captchaImage = captchaProducer.createImage(captchaText);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(captchaImage, "jpg", baos);
        byte[] imageBytes = baos.toByteArray();
        
        return Base64.getEncoder().encodeToString(imageBytes);
    }
}

这段代码使用了 kaptcha 库生成验证码文本和图像,并将图像转换为 Base64 格式以便在前端显示。

4. 创建控制器

接下来,我们需要创建一个控制器来处理客户端的请求。下面是 CaptchaController.java 的实现:

package com.example.captcha.controller;

import com.example.captcha.service.CaptchaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class CaptchaController {

    @Autowired
    private CaptchaService captchaService;

    @GetMapping("/captcha")
    public String getCaptcha() throws IOException {
        return captchaService.createCaptcha();
    }
}

以上代码实现了一个简单的 GET 请求接口,提供验证码的 Base64 字符串。

5. 配置应用属性

我们需要在 application.properties 中配置 kaptcha 的一些属性:

kaptcha.border=yes
kaptcha.border.color=105,179,90
kaptcha.image.height=40
kaptcha.image.width=100
kaptcha.textproducer.font.size=30
kaptcha.textproducer.char.font.color=black
kaptcha.textproducer.char.length=5
kaptcha.textproducer.char.string=abcde2345678gfynmnpwx

这些配置决定了验证码的样式和字符组合。

6. 前端展示

在前端,我们可以通过 <img> 标签来展示验证码。假设我们有一个简单的 HTML 页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Captcha Example</title>
</head>
<body>
    Captcha Example
    <img id="captcha" src="" alt="Captcha Image" />
    <button onclick="loadCaptcha()">Refresh Captcha</button>

    <script>
        function loadCaptcha() {
            fetch('/captcha')
                .then(response => response.text())
                .then(data => {
                    document.getElementById('captcha').src = 'data:image/jpeg;base64,' + data;
                });
        }

        loadCaptcha();
    </script>
</body>
</html>

这个页面在加载时会自动请求验证码,并将其展示在 <img> 标签中。

7. 统计验证码使用情况

在实际应用中,跟踪验证码的使用情况也是非常重要的,可以通过简单的饼状图来展示。

pie
    title 验证码使用统计
    "有效使用": 70
    "无效使用": 30

这个饼状图展示了有效和无效使用验证码的比例,有助于我们评估验证码功能的有效性。

8. 总结

本文介绍了如何使用 Spring Boot 和 kaptcha 库来实现验证码功能,包括后端服务的实现和前端展示。通过这一实现,可以有效地增强应用的安全性,防止恶意用户的攻击,提升用户体验。希望这篇文章能够为你在开发中提供帮助,并激发你探索更多的安全措施。随着技术的不断发展,保持对最新安全技术的关注,将有助于我们保护应用和用户的安全。