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