From 7992390afd0412dd6f6fa89007bbdd47acecd507 Mon Sep 17 00:00:00 2001 From: zlg <482370576@qq.com> Date: Fri, 10 May 2024 18:50:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BE=E7=89=87=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/config/SmsInitConfig.java | 1 - .../ReactRotateCaptchaController.java | 152 ++++++++------- .../controller/SchisandraOauthController.java | 1 + .../src/main/resources/image/test1.jpg | Bin 0 -> 21846 bytes .../pom.xml | 15 +- .../auth/common/entity/CaptchaResult.java | 46 +++++ .../auth/common/utils/RotateImageUtils.java | 177 ++++++++++++++++++ .../pom.xml | 1 - 8 files changed, 300 insertions(+), 93 deletions(-) create mode 100644 schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/resources/image/test1.jpg create mode 100644 schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/CaptchaResult.java create mode 100644 schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/RotateImageUtils.java diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java index 3d157dc..3df73ac 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java @@ -23,7 +23,6 @@ public class SmsInitConfig { List SchisandraSmsConfigBOs= schisandraSmsConfigDomainService.queryAll(); List schisandraSmsConfigDTOS = SchisandraSmsConfigDTOConvert.INSTANCE.convertBOToDTOList(SchisandraSmsConfigBOs); for (SchisandraSmsConfigDTO schisandraSmsConfig : schisandraSmsConfigDTOS){ - System.out.println(schisandraSmsConfig.toString()); if (schisandraSmsConfig!=null){ // 创建SmsBlend 短信实例 SmsFactory.createSmsBlend(smsReadConfig); diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java index 11a3ca6..e3262bb 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java @@ -2,6 +2,12 @@ package com.schisandra.auth.application.controller; import cn.hutool.core.lang.Assert; +import com.schisandra.auth.common.entity.CaptchaResult; +import com.schisandra.auth.common.entity.Result; +import com.schisandra.auth.common.redis.RedisUtil; +import com.schisandra.auth.common.utils.AESUtils; +import com.schisandra.auth.common.utils.RotateImageUtils; +import com.schisandra.auth.common.utils.SmsCodeUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -11,97 +17,87 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; import javax.imageio.ImageIO; +import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; import java.util.Base64; +import java.util.HashMap; +import java.util.Random; +import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/ReactRotateCaptcha/") @Slf4j public class ReactRotateCaptchaController { - @PostMapping (value = "get", produces = MediaType.IMAGE_PNG_VALUE) - public ResponseEntity get(){ - //前端可以直接根据URL:/image/{图片id} 来获取图片 注意:资源文件ID最好进行加密和设置有效期 - // 在实际开发中 一般先通过图片id查看数据库有没有这条记录 - String imageFilePath = "D:\\java_project\\schisandra-cloud-storage\\schisandra-cloud-storage-auth\\schisandra-cloud-storage-auth-application\\schisandra-cloud-storage-auth-application-controller\\src\\main\\java\\com\\schisandra\\auth\\application\\image\\test1.png"; - File file = new File(imageFilePath); - try { - BufferedImage bufferedImage = ImageIO.read(file); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ImageIO.write(bufferedImage, "png", byteArrayOutputStream); - byte[] imageBytes = byteArrayOutputStream.toByteArray(); // 读取图片数据的字节数组 - // 将图片字节数组转换为Base64编码的字符串 - String base64Image = Base64.getEncoder().encodeToString(imageBytes); - System.out.println(base64Image); - // 创建包含Base64编码的响应体的ResponseEntity对象,并设置正确的媒体类型和内容长度 - return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG) - .body(base64Image); - }catch (Exception e) { - e.printStackTrace(); - } - return ResponseEntity.ok().body(null); - } + @Resource + private RedisUtil redisUtil; + + public final String authRotateCaptchaPrefix = "auth.RotateCaptcha"; /** - * 请求图片地址, 返回的结果进行base64编码 - * @param imgUrl 图片地址 - * @return + * @description:获取图片 + * @param: [] + * @return: java.lang.String + * @author zlg + * @date: 2024/5/10 16:28 */ -// public static String requestUrlToBase64(String imgUrl) { -// //读取图片字节数组 -// byte[] data = null; -// try { -// InputStream in = new FileInputStream(imgUrl); -//// System.out.println("文件大小(字节)=" + in.available()); -// data = new byte[in.available()]; -// in.read(data); -// in.close(); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// //对字节数组进行Base64编码,得到Base64编码的字符串 -// return new String(Base64.encodeBase64(data)); -// -// } -// -// public static File convertBase64ToFile(String fileBase64String, String filePath, String fileName) { -// BufferedOutputStream bos = null; -// FileOutputStream fos = null; -// File file = null; -// try { -// File dir = new File(filePath); -// //判断文件目录是否存在 -// if (!dir.exists() && dir.isDirectory()) { -// dir.mkdirs(); -// } -// byte[] bfile = Base64.decodeBase64(fileBase64String); -// file = new File(filePath + File.separator + fileName); -// fos = new FileOutputStream(file); -// bos = new BufferedOutputStream(fos); -// bos.write(bfile); -// return file; -// } catch (Exception e) { -// e.printStackTrace(); -// } finally { -// if (bos != null) { -// try { -// bos.close(); -// } catch (IOException e1) { -// e1.printStackTrace(); -// } -// } -// if (fos != null) { -// try { -// fos.close(); -// } catch (IOException e1) { -// e1.printStackTrace(); -// } -// } -// } -// return null; -// } + @PostMapping("get") + public CaptchaResult get() throws Exception { + HashMap map = new HashMap<>(); + RotateImageUtils rotateImageUtils = new RotateImageUtils(); + + InputStream inputStream= ReactRotateCaptchaController.class.getClassLoader().getResourceAsStream("image/test1.jpg"); + BufferedImage image = ImageIO.read(inputStream); + Random random = new Random(); + double randomNumber = random.nextInt(280) + 40; + String key = AESUtils.getKey(); + String token = AESUtils.encrypt(String.valueOf(randomNumber), key); + String prefix = redisUtil.buildKey(authRotateCaptchaPrefix, token); + redisUtil.setNx(prefix, String.valueOf(randomNumber), 60L, TimeUnit.SECONDS); + try { + BufferedImage image1 = rotateImageUtils.rotateImage(image, randomNumber, Color.black); + map.put("token",token); + map.put("str", RotateImageUtils.BufferedImageToBase64(image1)); + return CaptchaResult.ok(map); + } catch (Exception e) { + return CaptchaResult.fail(); + } + } + + + /** + * @description: 验证图片 + * @param: [token, num] + * @return: com.schisandra.auth.common.entity.Result + * @author zlg + * @date: 2024/5/10 17:25 + */ + @PostMapping("verfiy") + public CaptchaResult verfiy(String token, Double num) { + if (num == null && token == null) { + return CaptchaResult.fail(); + } + String prefix = redisUtil.buildKey(authRotateCaptchaPrefix, token); + if (redisUtil.exist(prefix)) { + double realNum = Double.parseDouble(redisUtil.get(prefix)); + if (Math.abs(realNum - num) / realNum < 0.05) { + redisUtil.del(prefix); + return CaptchaResult.ok(); + } else { + return CaptchaResult.fail(); + } + } else { + return CaptchaResult.fail(); + } + + + } + } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraOauthController.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraOauthController.java index df9a4cc..c3b5d8a 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraOauthController.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraOauthController.java @@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil; import com.xkcoding.justauth.AuthRequestFactory; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/resources/image/test1.jpg b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/resources/image/test1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4498f7fda29e214f0281a5aacb98cc71e9079cf GIT binary patch literal 21846 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 z zJryV4P9~UF=bHfh>0r-fAMj!jLL>!9m;=>LCi#3wwWC_^qy0t5n8O^teTIpLy16xyoDlUY^OoBJ6U279l_zaA@^NQeW#&*ph7v#nB0+4;=73)0!;4jnPzp?^*S zU})5mlNGNAff#Uc?7|~Zh-oSX-CM0l0|A62&%u^i`+;2B8S}_l#&BP!nS7~nYZqu} z!*)ji@9}*S)qu^*!1p>p_pfi3>4)bq%KQ>OI6_0%yyna2>s8sl!t)4t_g^OS99kOQ zVjZVsoHEJYgXc{wGlb1C>c*=QMo-94(3jj&cbPlu?O!Lt!eMX<9*R6PPgMIy1GEoH z*RQw-lAA6nIzC^*+nX)5T}HqIIXE7JVKaLF&~W!-8h_I3pZ^Z)vAXo`=#9ZSM{*e} zz@BV-S~2jg*KlXqS|q)QYVvd3V2hE{gL?bVvq1^r3ApI)A>}+Osj+p~xeT?`&aq}z%B(;!*zweF10?|IK0x#6mFN{a z#jk0kkx2zVkdKXkZ1l61Hre{fH&pyUky+>Fx1lYwO$T+nc@LO@h}Ysf^#4P0%6207 zebIHtb*de5Pxqcowh(AB8@Fe`U+2Z(gcp!tf#IO?~E|DfNp6CBOv-~4~vLC|1+#D#aQk4C(BZWn_ zj^Z+W6X=d3O2#K=scmJN)87>e91TUYQsxO0tIaM1eST3=rp5OBDC=cN)_$5^V&C+z z-@7_1Dld0DV`R#b{e2&x?CVA4xWBkd=yPeO)8+Z(rJ0?jY@1tQtAX-;v$MfEem z_6GLea0y=jFk=6{&_r9? org.dromara.sms4j sms4j-spring-boot-starter - 3.2.1 + 3.2.1 + org.dromara.sms4j sms4j-Email-core @@ -108,12 +109,6 @@ 1.1.0 - - - org.projectlombok - lombok - true - @@ -122,12 +117,6 @@ 5.3.8 - - - com.google.guava - guava - 29.0-jre - org.apache.directory.studio diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/CaptchaResult.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/CaptchaResult.java new file mode 100644 index 0000000..4eb6bb4 --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/entity/CaptchaResult.java @@ -0,0 +1,46 @@ +package com.schisandra.auth.common.entity; + +import lombok.Data; + +@Data +public class CaptchaResult { + + private Integer code; + + private String msg; + + private T data; + + public static CaptchaResult ok() { + CaptchaResult result = new CaptchaResult(); + + result.setCode(0); + result.setMsg("Success"); + return result; + } + + public static CaptchaResult ok(T data) { + CaptchaResult result = new CaptchaResult(); + + result.setCode(0); + result.setMsg("Success"); + result.setData(data); + return result; + } + + public static CaptchaResult fail() { + CaptchaResult result = new CaptchaResult(); + + result.setCode(1); + result.setMsg("Fail"); + return result; + } + + public static CaptchaResult fail(T data) { + CaptchaResult result = new CaptchaResult(); + result.setCode(1); + result.setMsg("Fail"); + result.setData(data); + return result; + } +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/RotateImageUtils.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/RotateImageUtils.java new file mode 100644 index 0000000..2a3b6dd --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/RotateImageUtils.java @@ -0,0 +1,177 @@ +package com.schisandra.auth.common.utils; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; + +public class RotateImageUtils { + + public static Color bgColor = new Color(255, 255, 255); + + + /** + * @description: 压缩图片并将图片转换成base64 + * @param: [bufferedImage] + * @return: java.lang.String + * @author zlg + * @date: 2024/5/9 13:13 + */ + public static String BufferedImageToBase64(BufferedImage bufferedImage) throws IOException { + int targetWidth = 400; + int targetHeight = 400; + // 获取原始图片的尺寸 + int originalWidth = bufferedImage.getWidth(); + int originalHeight = bufferedImage.getHeight(); + // 创建一个新的 BufferedImage,用于存放处理后的图片 + BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, bufferedImage.getType()); + // 创建一个 Graphics2D 对象,用于绘制新图片 + Graphics2D graphics = outputImage.createGraphics(); + // 如果原始图片尺寸大于目标尺寸,则进行压缩 + if (originalWidth > targetWidth || originalHeight > targetHeight) { + Image scaledImage = bufferedImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH); + graphics.drawImage(scaledImage, 0, 0, null); + } + graphics.dispose(); + ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流 + ImageIO.write(outputImage, "png", baos);//写入流中 + byte[] bytes = baos.toByteArray();//转换成字节 + BASE64Encoder encoder = new BASE64Encoder(); + String png_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串 + png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n + return "data:image/jpg;base64," + png_base64; + + } + + /** + * @description: 将base64转换成图片 + * @param: [base64] + * @return: java.awt.image.BufferedImage + * @author zlg + * @date: 2024/5/9 13:14 + */ + public static BufferedImage base64ToBufferedImage(String base64) { + BASE64Decoder decoder = new sun.misc.BASE64Decoder(); + try { + byte[] bytes1 = decoder.decodeBuffer(base64); + ByteArrayInputStream bais = new ByteArrayInputStream(bytes1); + return ImageIO.read(bais); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * @description: 获取旋转后的图片 + * @param: [image, theta, backgroundColor] + * @return: java.awt.image.BufferedImage + * @author zlg + * @date: 2024/5/9 13:14 + */ + public BufferedImage rotateImage(BufferedImage image, double theta, Color backgroundColor) { + int width = image.getWidth(); + int height = image.getHeight(); + double angle = theta * Math.PI / 180; // 度转弧度 + double[] xCoords = getX(width / 2, height / 2, angle); + double[] yCoords = getY(width / 2, height / 2, angle); + int WIDTH = (int) (xCoords[3] - xCoords[0]); + int HEIGHT = (int) (yCoords[3] - yCoords[0]); + BufferedImage resultImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); + for (int i = 0; i < WIDTH; i++) { + for (int j = 0; j < HEIGHT; j++) { + int x = i - WIDTH / 2; + int y = HEIGHT / 2 - j; + double radius = Math.sqrt(x * x + y * y); + double angle1; + if (y > 0) { + angle1 = Math.acos(x / radius); + } else { + angle1 = 2 * Math.PI - Math.acos(x / radius); + } + x = (int) Math.round(radius * Math.cos(angle1 - angle)); + y = (int) Math.round(radius * Math.sin(angle1 - angle)); + if (x < (width / 2) & x > -(width / 2) & y < (height / 2) & y > -(height / 2)) { + int rgb = image.getRGB((int) Math.round(x + width / 2), (int) Math.round(height / 2 - y)); + resultImage.setRGB(i, j, rgb); + } else { + resultImage.setRGB(i, j, -1); + } + } + } + return resultImage; + } + + // 获取四个角点旋转后Y方向坐标 + private double[] getY(int i, int j, double angle) { + double results[] = new double[4]; + double radius = Math.sqrt(i * i + j * j); + double angle1 = Math.asin(j / radius); + results[0] = radius * Math.sin(angle1 + angle); + results[1] = radius * Math.sin(Math.PI - angle1 + angle); + results[2] = -results[0]; + results[3] = -results[1]; + Arrays.sort(results); + return results; + } + + // 获取四个角点旋转后X方向坐标 + private double[] getX(int i, int j, double angle) { + double results[] = new double[4]; + double radius = Math.sqrt(i * i + j * j); + double angle1 = Math.acos(i / radius); + results[0] = radius * Math.cos(angle1 + angle); + results[1] = radius * Math.cos(Math.PI - angle1 + angle); + results[2] = -results[0]; + results[3] = -results[1]; + Arrays.sort(results); + return results; + } + + /** + * @description: 获取旋转后的图片 + * @param: [image] + * @return: java.awt.image.BufferedImage + * @author zlg + * @date: 2024/5/9 13:14 + */ + public BufferedImage writeCyclePic(BufferedImage image) { + BufferedImage newImage = new BufferedImage(350, 350, BufferedImage.TYPE_INT_BGR); + try { + int width = image.getWidth(); + int heigth = image.getHeight(); + double x0 = width / 2; + double y0 = heigth / 2; + int woffset = (width - 350) / 2; + int hoffset = (heigth - 350) / 2; + for (int i = woffset; i < 350 + woffset; i++) { + for (int j = hoffset; j < 350 + hoffset; j++) { + double r = Math.sqrt(Math.pow(Math.abs(i - x0), 2.0) + Math.pow(Math.abs(j - y0), 2.0)); + if (r > (x0 - woffset)) { + newImage.setRGB(i - woffset, j - hoffset, -1); + } else { + newImage.setRGB(i - woffset, j - hoffset, image.getRGB(i, j)); + } + } + } + return newImage; + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + } + + + + +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-starter/pom.xml b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-starter/pom.xml index 746aa35..f58e2ae 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-starter/pom.xml +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-starter/pom.xml @@ -37,7 +37,6 @@ spring-cloud-starter-bootstrap - com.schisandra schisandra-cloud-storage-auth-application-controller