New file |
| | |
| | | package com.dy.pipIrrApp.captcha; |
| | | |
| | | import com.dy.pipIrrApp.captcha.dto.CaptchaDomain; |
| | | import com.dy.pipIrrGlobal.daoBa.BaCaptchaMapper; |
| | | import com.dy.pipIrrGlobal.pojoBa.BaCaptcha; |
| | | import com.google.code.kaptcha.Producer; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.imageio.ImageIO; |
| | | import java.io.ByteArrayOutputStream; |
| | | import java.util.Base64; |
| | | import java.util.UUID; |
| | | |
| | | /** |
| | | * @author ZhuBaoMin |
| | | * @date 2024-09-11 13:46 |
| | | * @LastEditTime 2024-09-11 13:46 |
| | | * @Description |
| | | */ |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class CaptchaSV { |
| | | @Autowired |
| | | private BaCaptchaMapper baCaptchaMapper; |
| | | |
| | | @Resource(name = "captchaProducer") |
| | | private Producer captchaProducer; |
| | | |
| | | @Resource(name = "captchaProducerMathOne") |
| | | private Producer captchaProducerMathOne; |
| | | |
| | | @Resource(name = "captchaProducerMathTwo") |
| | | private Producer captchaProducerMathTwo; |
| | | |
| | | private static final String TYPE_CHAR = "char"; |
| | | private static final String TYPE_MATH_ONE = "math"; |
| | | private static final String TYPE_MATH_TWO = "math2"; |
| | | |
| | | /** |
| | | * Kaptcha生成验证码实体 |
| | | * @param type,char - 字符(缺省) | math - 一位数算式 | math2 - 两位数算式 |
| | | * @return |
| | | */ |
| | | public CaptchaDomain createGoogleCaptcha(String type) { |
| | | // 定义验证码实体 |
| | | CaptchaDomain captchaDomain = new CaptchaDomain(); |
| | | // 一位数加减乘除 |
| | | if (TYPE_MATH_ONE.equals(type)) { |
| | | // 生成文本 |
| | | String producerText = captchaProducerMathOne.createText(); |
| | | // 设置验证码字符 |
| | | captchaDomain.setText(producerText.substring(0, producerText.indexOf("@"))); |
| | | // 设置验证码答案码 |
| | | captchaDomain.setCode(producerText.substring(producerText.indexOf("@") + 1)); |
| | | // 设置验证码图片 |
| | | captchaDomain.setImage(captchaProducerMathOne.createImage(captchaDomain.getText())); |
| | | } |
| | | // 两位数加减乘除 |
| | | else if (TYPE_MATH_TWO.equals(type)) { |
| | | String producerText = captchaProducerMathTwo.createText(); |
| | | captchaDomain.setText(producerText.substring(0, producerText.indexOf("@"))); |
| | | captchaDomain.setCode(producerText.substring(producerText.indexOf("@") + 1)); |
| | | captchaDomain.setImage(captchaProducerMathTwo.createImage(captchaDomain.getText())); |
| | | } |
| | | // 缺省情况:字符 |
| | | else { |
| | | captchaDomain.setText(captchaProducer.createText()); |
| | | captchaDomain.setCode(captchaDomain.getText()); |
| | | captchaDomain.setImage(captchaProducer.createImage(captchaDomain.getText())); |
| | | } |
| | | // 生成base64 |
| | | try { |
| | | // 定义字节数组输出流 |
| | | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| | | // 将图像以 jpg 的形式,写到字节数组输出流中 |
| | | ImageIO.write(captchaDomain.getImage(), "jpg", outputStream); |
| | | |
| | | // 写入base64格式 |
| | | captchaDomain.setBase64("data:image/jpg;base64," + Base64.getEncoder().encodeToString(outputStream.toByteArray())); |
| | | // 写入唯一Token |
| | | captchaDomain.setToken(UUID.randomUUID().toString()); |
| | | // 返回结果 |
| | | return captchaDomain; |
| | | } catch (Exception e) { |
| | | System.out.println(e.getMessage()); |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 添加图片验证记录 |
| | | * @param po |
| | | * @return |
| | | */ |
| | | public Long addCaptcha(BaCaptcha po) { |
| | | baCaptchaMapper.insert(po); |
| | | return po.getId(); |
| | | } |
| | | |
| | | } |