You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.7 KiB

4 weeks ago
  1. // com.example.demo.controller.CaptchaController.java
  2. package com.example.demo.controller.coin;
  3. import com.google.code.kaptcha.Producer;
  4. import jakarta.servlet.http.HttpServletResponse;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.redis.core.StringRedisTemplate;
  7. import org.springframework.web.bind.annotation.GetMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import javax.imageio.ImageIO;
  11. import java.awt.image.BufferedImage;
  12. import java.io.IOException;
  13. import java.util.concurrent.TimeUnit;
  14. @RestController
  15. public class CaptchaController {
  16. @Autowired
  17. private Producer kaptchaProducer;
  18. @Autowired
  19. private StringRedisTemplate redisTemplate;
  20. /**
  21. * 获取图形验证码
  22. * @param uuid 前端生成的唯一标识用于关联验证码
  23. */
  24. @GetMapping("/captcha")
  25. public void captcha(@RequestParam String uuid, HttpServletResponse response) throws IOException {
  26. if (uuid == null || uuid.trim().isEmpty()) {
  27. response.sendError(HttpServletResponse.SC_BAD_REQUEST, "uuid is required");
  28. return;
  29. }
  30. // 生成验证码文本和图片
  31. String code = kaptchaProducer.createText();
  32. BufferedImage image = kaptchaProducer.createImage(code);
  33. // 存入 Redis,5分钟过期
  34. redisTemplate.opsForValue().set("CAPTCHA:" + uuid, code, 5, TimeUnit.MINUTES);
  35. // 输出图片
  36. response.setHeader("Cache-Control", "no-store");
  37. response.setContentType("image/jpeg");
  38. ImageIO.write(image, "jpg", response.getOutputStream());
  39. }
  40. }