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