SpringBoot项目实现验证码
发布人:shili8
发布时间:2024-12-29 17:51
阅读次数:0
**Spring Boot项目实现验证码**
在 Spring Boot项目中,验证码(CAPTCHA)是防止恶意爬虫或机器人滥用系统的一种有效手段。通过向用户展示一个图像验证码,并要求其输入正确的验证码,可以有效地阻止一些不良行为。
本文将介绍如何在 Spring Boot项目中实现验证码,包括验证码生成、存储和验证等方面。
### 一、依赖配置首先,我们需要在 `pom.xml` 文件中添加相关依赖:
xml<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
### 二、验证码生成我们使用 Caffeine 库来生成验证码。首先,我们需要创建一个 `CaptchaGenerator` 类:
javaimport com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
public class CaptchaGenerator {
private static final Cache CAPTCHA_CACHE = Caffeine.newBuilder()
.maximumSize(1000)
.build();
public static String generateCaptcha() {
//生成随机验证码 String captcha = getRandomString(6);
// 将验证码存储在缓存中 CAPTCHA_CACHE.put(captcha, captcha);
return captcha;
}
private static String getRandomString(int length) {
StringBuilder sb = new StringBuilder(length);
for (int i =0; i < length; i++) {
int randomInt = ThreadLocalRandom.current().nextInt(48,57 +1); //生成随机数字 sb.append((char) randomInt);
}
return sb.toString();
}
}
### 三、验证码存储我们使用 Redis 来存储验证码。首先,我们需要在 `application.properties` 文件中配置 Redis:
propertiesspring.redis.host=localhostspring.redis.port=6379spring.redis.database=0
然后,我们可以创建一个 `CaptchaRepository` 类来存储和获取验证码:
javaimport org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
@Repositorypublic class CaptchaRepository {
private final RedisTemplate redisTemplate;
public CaptchaRepository(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void saveCaptcha(String captcha) {
redisTemplate.opsForValue().set(captcha, captcha);
}
public String getCaptcha(String captcha) {
return redisTemplate.opsForValue().get(captcha);
}
}
### 四、验证码验证我们可以创建一个 `CaptchaValidator` 类来验证用户输入的验证码:
javaimport org.springframework.stereotype.Service;
@Servicepublic class CaptchaValidator {
private final CaptchaRepository captchaRepository;
public CaptchaValidator(CaptchaRepository captchaRepository) {
this.captchaRepository = captchaRepository;
}
public boolean validateCaptcha(String inputCaptcha, String expectedCaptcha) {
return inputCaptcha.equals(expectedCaptcha);
}
}
### 五、整合验证码我们可以创建一个 `CaptchaController` 类来整合验证码生成、存储和验证:
javaimport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class CaptchaController {
private final CaptchaGenerator captchaGenerator;
private final CaptchaRepository captchaRepository;
private final CaptchaValidator captchaValidator;
@Autowired public CaptchaController(CaptchaGenerator captchaGenerator, CaptchaRepository captchaRepository, CaptchaValidator captchaValidator) {
this.captchaGenerator = captchaGenerator;
this.captchaRepository = captchaRepository;
this.captchaValidator = captchaValidator;
}
@GetMapping("/captcha")
public String getCaptcha() {
return captchaGenerator.generateCaptcha();
}
@PostMapping("/validate")
public boolean validate(@RequestParam("inputCaptcha") String inputCaptcha) {
String expectedCaptcha = captchaRepository.getCaptcha(inputCaptcha);
return captchaValidator.validateCaptcha(inputCaptcha, expectedCaptcha);
}
}
### 六、测试我们可以使用 Postman 或其他工具来测试验证码生成和验证:
* GET /captcha:生成一个新的验证码* POST /validate:验证用户输入的验证码通过以上步骤,我们成功地在 Spring Boot项目中实现了验证码功能。

