|
@@ -0,0 +1,71 @@
|
|
|
+package com.backendsys.modules.system.service.impl;
|
|
|
+
|
|
|
+import com.backendsys.config.Kaptcha.KaptchaUtil;
|
|
|
+import com.backendsys.modules.common.config.redis.utils.RedisUtil;
|
|
|
+import com.backendsys.modules.system.dao.SysMobileAreaDao;
|
|
|
+import com.backendsys.modules.system.entity.SysMobileArea;
|
|
|
+import com.backendsys.modules.system.service.SysAuthV2Service;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.google.code.kaptcha.Producer;
|
|
|
+import jakarta.servlet.ServletOutputStream;
|
|
|
+import jakarta.servlet.http.HttpServletRequest;
|
|
|
+import jakarta.servlet.http.HttpServletResponse;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.imageio.ImageIO;
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class SysAuthV2ServiceImpl implements SysAuthV2Service {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RedisUtil redisUtil;
|
|
|
+ @Autowired
|
|
|
+ private Producer captchaProducer;
|
|
|
+ @Value("${CAPTCHA_DURATION}")
|
|
|
+ private Integer CAPTCHA_DURATION;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysMobileAreaDao sysMobileAreaDao;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void renderCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
|
|
+ byte[] captchaChallengeAsJpeg;
|
|
|
+ ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
|
|
|
+ try {
|
|
|
+ String createText = captchaProducer.createText();
|
|
|
+ // 获得当前 (UA + IP) 生成的 Key
|
|
|
+ String captchaRedisKey = KaptchaUtil.getKaptchaKey(request);
|
|
|
+ // 保存 验证码字符串 到 redis 中
|
|
|
+ redisUtil.setCacheObject(captchaRedisKey, createText, this.CAPTCHA_DURATION, TimeUnit.MILLISECONDS);
|
|
|
+ // 返回 BufferedImage 对象并转为 byte 写入到 byte 数组中
|
|
|
+ BufferedImage challenge = captchaProducer.createImage(createText);
|
|
|
+ ImageIO.write(challenge, "jpg", jpegOutputStream);
|
|
|
+ } catch (Exception e) {
|
|
|
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
|
|
+ }
|
|
|
+ // 定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
|
|
|
+ captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
|
|
|
+ response.setHeader("Cache-Control", "no-store");
|
|
|
+ response.setHeader("Pragma", "no-cache");
|
|
|
+ response.setDateHeader("Expires", 0);
|
|
|
+ response.setContentType("image/jpeg");
|
|
|
+ ServletOutputStream responseOutputStream = response.getOutputStream();
|
|
|
+ responseOutputStream.write(captchaChallengeAsJpeg);
|
|
|
+ responseOutputStream.flush();
|
|
|
+ responseOutputStream.close();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<SysMobileArea> getMobileAreaList(SysMobileArea sysMobileArea) {
|
|
|
+ return sysMobileAreaDao.selectMobileAreaList(sysMobileArea);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|