| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package com.ruoyi.web.controller.common;
- import cn.hutool.captcha.AbstractCaptcha;
- import cn.hutool.captcha.CircleCaptcha;
- import cn.hutool.captcha.LineCaptcha;
- import cn.hutool.captcha.ShearCaptcha;
- import cn.hutool.captcha.generator.CodeGenerator;
- import cn.hutool.captcha.generator.MathGenerator;
- import cn.hutool.captcha.generator.RandomGenerator;
- import cn.hutool.core.convert.Convert;
- import cn.hutool.core.util.IdUtil;
- import cn.hutool.core.util.StrUtil;
- import com.ruoyi.common.constant.Constants;
- import com.ruoyi.common.core.domain.AjaxResult;
- import com.ruoyi.common.core.redis.RedisCache;
- import com.ruoyi.framework.config.properties.CaptchaProperties;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
- import javax.annotation.Resource;
- import java.util.concurrent.TimeUnit;
- /**
- * 验证码操作处理
- *
- * @author Lion Li
- */
- @RestController
- public class CaptchaController {
- // 圆圈干扰验证码
- @Resource(name = "CircleCaptcha")
- private CircleCaptcha circleCaptcha;
- // 线段干扰的验证码
- @Resource(name = "LineCaptcha")
- private LineCaptcha lineCaptcha;
- // 扭曲干扰验证码
- @Resource(name = "ShearCaptcha")
- private ShearCaptcha shearCaptcha;
- @Autowired
- private RedisCache redisCache;
- @Autowired
- private CaptchaProperties captchaProperties;
- /**
- * 生成验证码
- */
- @GetMapping("/captchaImage")
- public AjaxResult getCode() {
- // 保存验证码信息
- String uuid = IdUtil.simpleUUID();
- String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
- String code = null;
- // 生成验证码
- CodeGenerator codeGenerator;
- AbstractCaptcha captcha;
- switch (captchaProperties.getType()) {
- case "math":
- codeGenerator = new MathGenerator(captchaProperties.getNumberLength());
- break;
- case "char":
- codeGenerator = new RandomGenerator(captchaProperties.getCharLength());
- break;
- default:
- throw new IllegalArgumentException("验证码类型异常");
- }
- switch (captchaProperties.getCategory()) {
- case "line":
- captcha = lineCaptcha;
- break;
- case "circle":
- captcha = circleCaptcha;
- break;
- case "shear":
- captcha = shearCaptcha;
- break;
- default:
- throw new IllegalArgumentException("验证码类别异常");
- }
- captcha.setGenerator(codeGenerator);
- captcha.createCode();
- if ("math".equals(captchaProperties.getType())) {
- code = getCodeResult(captcha.getCode());
- } else if ("char".equals(captchaProperties.getType())) {
- code = captcha.getCode();
- }
- redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
- AjaxResult ajax = AjaxResult.success();
- ajax.put("uuid", uuid);
- ajax.put("img", captcha.getImageBase64());
- return ajax;
- }
- private String getCodeResult(String capStr) {
- int numberLength = captchaProperties.getNumberLength();
- int a = Convert.toInt(StrUtil.sub(capStr, 0, numberLength).trim());
- char operator = capStr.charAt(numberLength);
- int b = Convert.toInt(StrUtil.sub(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
- switch (operator) {
- case '*':
- return a * b + "";
- case '+':
- return a + b + "";
- case '-':
- return a - b + "";
- default:
- return "";
- }
- }
- }
|