使用Spring Boot实现图形验证码

在Web应用中,图形验证码是一种常见的用户身份验证方式,能够有效防止恶意爬虫和机器人注册等问题。本文将介绍如何在Spring Boot项目中实现图形验证码功能,并提供完整的代码示例。

1. 创建Spring Boot项目

首先,确保你的开发环境中已经安装了JDK和Maven。可以使用Spring Initializr(https://start.spring.io/)来生成一个新的Spring Boot项目,选择相关依赖如Spring Web。

2. 添加依赖

pom.xml中添加一些需要的依赖:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

我们使用commons-io库来简化输入输出操作。

3. 创建验证码生成器

接下来,我们创建一个验证码生成器类。这个类将负责生成随机字符、绘制图形并输出成图片格式。

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class CaptchaUtil {
    private static final String CHAR_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    private static final int WIDTH = 200;
    private static final int HEIGHT = 80;

    public static void generateCaptcha(HttpServletResponse response) throws IOException {
        // 创建一个BufferedImage对象
        BufferedImage bufferedImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = bufferedImage.getGraphics();

        // 填充背景色
        graphics.setColor(Color.LIGHT_GRAY);
        graphics.fillRect(0, 0, WIDTH, HEIGHT);

        // 随机生成验证码字符串
        String captchaText = generateRandomString(5);
        graphics.setColor(Color.BLACK);
        graphics.setFont(new Font("Arial", Font.BOLD, 40));
        graphics.drawString(captchaText, 30, 50);

        // 发送图片到客户端
        response.setContentType("image/jpeg");
        ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
    }

    private static String generateRandomString(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(CHAR_STRING.length());
            sb.append(CHAR_STRING.charAt(index));
        }
        return sb.toString();
    }
}

4. 创建控制器

我们需要一个控制器来处理验证码的请求并返回图片。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
public class CaptchaController {

    @GetMapping("/captcha")
    public void getCaptcha(HttpServletResponse response) throws IOException {
        CaptchaUtil.generateCaptcha(response);
    }
}

5. 运行项目

完成上述步骤后,可以运行Spring Boot应用。访问http://localhost:8080/captcha,你会看到生成的图形验证码。每次刷新页面都会生成新的验证码。

6. 验证用户输入

实现验证码生成后,下一步是验证用户输入的验证码。可以在用户提交表单的时候,将用户输入的验证码与服务器生成的验证码进行对比。

通常,我们需要在服务器端暂时保存生成的验证码,例如使用HttpSession

import javax.servlet.http.HttpSession;

@PostMapping("/submit")
public String submitForm(@RequestParam("captcha") String captcha, HttpSession session) {
    String sessionCaptcha = (String) session.getAttribute("captcha");
    if (sessionCaptcha != null && sessionCaptcha.equals(captcha)) {
        return "验证通过";
    } else {
        return "验证码错误";
    }
}

此处,我们需要在生成验证码的过程中,将验证码存入HttpSession中:

session.setAttribute("captcha", captchaText);

结语

通过上面的步骤,我们实现了一个简单的图形验证码功能。虽然这个示例非常基础,但为实际应用提供了一个参考框架。在真实应用中,还可以增加更复杂的干扰线、背景噪声以及验证码的有效性控制(如时间限制、次数限制等),以提升安全性。希望本文能对你有所帮助!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部