当前位置:实例文章 » JAVA Web实例» [文章]SpringBoot项目实现验证码

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项目中实现了验证码功能。

其他信息

其他资源

Top