CaptchaService.java 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.dto.Captcha;
  3. import com.pig4cloud.captcha.ArithmeticCaptcha;
  4. import lombok.AllArgsConstructor;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.ehcache.UserManagedCache;
  7. import org.ehcache.config.builders.ExpiryPolicyBuilder;
  8. import org.ehcache.config.builders.UserManagedCacheBuilder;
  9. import org.springframework.stereotype.Service;
  10. import java.awt.*;
  11. import java.io.IOException;
  12. import java.time.Duration;
  13. import java.util.UUID;
  14. @Service
  15. @AllArgsConstructor
  16. public class CaptchaService {
  17. private final UserManagedCache<String, String> captchaCache =
  18. UserManagedCacheBuilder.newUserManagedCacheBuilder(String.class, String.class)
  19. .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofMinutes(10)))
  20. .build(true);
  21. public Captcha gen() throws IOException, FontFormatException {
  22. String key = UUID.randomUUID().toString();
  23. // SpecCaptcha specCaptcha = new SpecCaptcha(90 * 2, 32 * 2, 5);
  24. // specCaptcha.setFont(com.wf.captcha.base.Captcha.FONT_7, 24 * 2);
  25. // String code = specCaptcha.text().toLowerCase();
  26. // String image = specCaptcha.toBase64();
  27. // captchaCache.put(key, code);
  28. // 算术类型
  29. ArithmeticCaptcha captcha = new ArithmeticCaptcha(150, 48);
  30. captcha.setFont(6, 15 * 2);
  31. captcha.setLen(2); // 几位数运算,默认是两位
  32. captcha.getArithmeticString(); // 获取运算的公式:3+2=?
  33. captcha.supportAlgorithmSign(2); // 可设置支持的算法:2 表示只生成带加减法的公式
  34. captcha.setDifficulty(99); // 设置计算难度,参与计算的每一个整数的最大值
  35. String code = captcha.text(); // 获取运算的结果:5
  36. String image = captcha.toBase64(); // 输出验证码
  37. captchaCache.put(key, code);
  38. return new Captcha(key, image);
  39. }
  40. public boolean verify(String key, String code) {
  41. if (StringUtils.isBlank(key) || StringUtils.isBlank(code)) {
  42. return false;
  43. }
  44. code = code.toLowerCase();
  45. boolean verify = false;
  46. String trueCode = captchaCache.get(key);
  47. if (StringUtils.isNotBlank(trueCode) && trueCode.equals(code)) {
  48. verify = true;
  49. }
  50. return verify;
  51. }
  52. }