From cf566cbe51e917833f3e4e9820b8656b9c7c6a7c Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Mon, 11 Jul 2022 11:21:30 +0800
Subject: [PATCH] fix
---
src/main/java/com/xcong/farmer/cms/modules/system/util/CaptchaUtil.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/xcong/farmer/cms/modules/system/util/CaptchaUtil.java b/src/main/java/com/xcong/farmer/cms/modules/system/util/CaptchaUtil.java
index 3179140..49f86b8 100644
--- a/src/main/java/com/xcong/farmer/cms/modules/system/util/CaptchaUtil.java
+++ b/src/main/java/com/xcong/farmer/cms/modules/system/util/CaptchaUtil.java
@@ -10,7 +10,8 @@
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.util.Map;
+import java.util.*;
+import java.awt.*;
@Component
public class CaptchaUtil {
@@ -24,7 +25,7 @@
//生成文字验证码
String text = producer.createText();
//生成文字对应的图片验证码
- BufferedImage image = producer.createImage(text);
+ BufferedImage image = creatImage(text);
//将图片写出
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
@@ -35,4 +36,56 @@
token.put("img", encoder.encode(outputStream.toByteArray()));
return Result.ok(token);
}
+
+ private static final long serialVersionUID = 1L;
+
+ //给定范围获得随机颜色
+ public Color getRandColor(int fc, int bc) {
+ Random random = new Random();
+ if (fc > 255) {
+ fc = 255;
+ }
+ if (bc > 255) {
+ bc = 255;
+ }
+ int r = fc + random.nextInt(bc - fc);
+ int g = fc + random.nextInt(bc - fc);
+ int b = fc + random.nextInt(bc - fc);
+ return new Color(r, g, b);
+ }
+
+ public BufferedImage creatImage(String code) {
+ int width = 150, height = 42;
+ //生成随机类
+ Random random = new Random();
+ BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ //获取图形上下文
+ Graphics g = image.getGraphics();
+ // 设定背景色
+ g.setColor(getRandColor(200, 250));
+ g.fillRect(0, 0, width, height);
+ //设定字体 第二个参数为字体为加粗
+ g.setFont(new Font("Times New Roman", Font.BOLD, 45));
+ // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
+ g.setColor(getRandColor(160, 200));
+ for (int i = 0; i < 155; i++) {
+ int x = random.nextInt(width);
+ int y = random.nextInt(height);
+ int xl = random.nextInt(12);
+ int yl = random.nextInt(12);
+ g.drawLine(x, y, x + xl, y + yl);
+ }
+ // 取随机产生的认证码(4位数字)
+ for (int i = 0; i < code.length(); i++) {
+ String rand = code.substring(i, i + 1);
+ // 将认证码显示到图象中
+ g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
+ //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
+ g.drawString(rand, 30 * i + 18, 35);
+ }
+ // 图象生效
+ g.dispose();
+ return image;
+ }
+
}
--
Gitblit v1.9.1