From 531f627319d40ac859764580b5cee2813152c92a Mon Sep 17 00:00:00 2001 From: xingyu Date: Sun, 29 Jan 2023 14:30:45 +0800 Subject: [PATCH] chore: update 1.0.2 --- README.md | 6 +-- core/captcha-plus/README.md | 2 +- core/captcha-plus/pom.xml | 2 +- .../captcha/model/common/RepCodeEnum.java | 3 +- .../service/impl/AbstractCaptchaService.java | 22 +++++++--- .../impl/BlockPuzzleCaptchaServiceImpl.java | 21 ++++----- .../impl/CaptchaCacheServiceMemImpl.java | 2 +- .../service/impl/CaptchaServiceFactory.java | 4 +- .../impl/ClickWordCaptchaServiceImpl.java | 7 ++- .../service/impl/FrequencyLimitHandler.java | 12 +++--- .../com/xingyuv/captcha/util/AESUtil.java | 40 +++++++++--------- .../xingyuv/captcha/util/FileCopyUtils.java | 19 +++------ .../com/xingyuv/captcha/util/ImageUtils.java | 25 +++++++---- .../com/xingyuv/captcha/util/JsonUtil.java | 2 +- .../com/xingyuv/captcha/util/RandomUtils.java | 26 ++++++------ .../com/xingyuv/captcha/util/StreamUtils.java | 5 --- .../com/xingyuv/captcha/util/StringUtils.java | 4 +- .../defaultImages/jigsaw/original/bg8.png | Bin 74254 -> 0 bytes core/spring-boot-starter-captcha-plus/pom.xml | 8 ++-- .../properties/AjCaptchaProperties.java | 4 +- pom.xml | 6 +-- view/doc/docs/captchaDoc/java.md | 2 +- 22 files changed, 113 insertions(+), 109 deletions(-) delete mode 100644 core/captcha-plus/src/main/resources/defaultImages/jigsaw/original/bg8.png diff --git a/README.md b/README.md index 2fdff5f..98c74cb 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ spring mvc com.xingyuv captcha-plus - 1.0.1 + 1.0.2 ``` spring boot 2 @@ -23,7 +23,7 @@ spring boot 2 com.xingyuv spring-boot-starter-captcha-plus - 1.0.1 + 1.0.2 ``` spring boot 3 @@ -31,7 +31,7 @@ spring boot 3 com.xingyuv spring-boot-starter-captcha-plus - 1.0.1 + 1.0.2 ``` diff --git a/core/captcha-plus/README.md b/core/captcha-plus/README.md index e4b598f..729644e 100644 --- a/core/captcha-plus/README.md +++ b/core/captcha-plus/README.md @@ -11,7 +11,7 @@ a.引入jar,已上传至maven中央仓库。 com.xingyuv captcha-plus - 1.0.1 + 1.0.2 ``` b.修改application.properties,自定义底图和水印,启动后前端就可以请求接口了。[社区底图库](https://gitee.com/anji-plus/AJ-Captcha-Images) diff --git a/core/captcha-plus/pom.xml b/core/captcha-plus/pom.xml index 497b28c..6324152 100644 --- a/core/captcha-plus/pom.xml +++ b/core/captcha-plus/pom.xml @@ -6,7 +6,7 @@ com.xingyuv captcha-plus - 1.0.1 + 1.0.2 ${project.groupId}:${project.artifactId} captcha-plus.jar diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/RepCodeEnum.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/RepCodeEnum.java index 4c212c2..9a3c59a 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/RepCodeEnum.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/RepCodeEnum.java @@ -39,8 +39,7 @@ public enum RepCodeEnum { API_REQ_INVALID("6206", "无效请求,请重新获取验证码"), API_REQ_LOCK_GET_ERROR("6202", "接口验证失败数过多,请稍后再试"), API_REQ_LIMIT_CHECK_ERROR("6204", "check接口请求次数超限,请稍后再试!"), - API_REQ_LIMIT_VERIFY_ERROR("6205", "verify请求次数超限!"), - ; + API_REQ_LIMIT_VERIFY_ERROR("6205", "verify请求次数超限!"); private String code; private String desc; diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java index 236e411..86947bf 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java @@ -51,7 +51,10 @@ public abstract class AbstractCaptchaService implements CaptchaService { protected static String waterMarkFontStr = "WenQuanZhengHei.ttf"; - protected Font waterMarkFont;//水印字体 + /** + * 水印字体 + */ + protected Font waterMarkFont; protected static String slipOffset = "5"; @@ -59,13 +62,19 @@ public abstract class AbstractCaptchaService implements CaptchaService { protected static String clickWordFontStr = "WenQuanZhengHei.ttf"; - protected Font clickWordFont;//点选文字字体 + /** + * 点选文字字体 + */ + protected Font clickWordFont; protected static String cacheType = "local"; protected static int captchaInterferenceOptions = 0; - //判断应用是否实现了自定义缓存,没有就使用内存 + /** + * 判断应用是否实现了自定义缓存,没有就使用内存 + * @param config config + */ @Override public void init(final Properties config) { //初始化底图 @@ -242,9 +251,10 @@ public static boolean base64StrToImage(String imgStr, String path) { /** * 解密前端坐标aes加密 * - * @param point - * @return - * @throws Exception + * @param point 前端坐标 + * @param key key + * @return 前端坐标aes加密 + * @throws Exception E */ public static String decrypt(String point, String key) throws Exception { return AESUtil.aesDecrypt(point, key); diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java index cf816d8..f48bba6 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java @@ -152,8 +152,10 @@ public ResponseModel verification(CaptchaVO captchaVO) { /** * 根据模板切图 - * - * @throws Exception + * @param originalImage originalImage + * @param jigsawImage jigsawImage + * @param jigsawImageBase64 jigsawImageBase64 + * @return CaptchaVO */ public CaptchaVO pictureTemplatesCut(BufferedImage originalImage, BufferedImage jigsawImage, String jigsawImageBase64) { try { @@ -167,7 +169,6 @@ public CaptchaVO pictureTemplatesCut(BufferedImage originalImage, BufferedImage //随机生成拼图坐标 PointVO point = generateJigsawPoint(originalWidth, originalHeight, jigsawWidth, jigsawHeight); int x = point.getX(); - int y = point.getY(); //生成新的拼图图像 BufferedImage newJigsawImage = new BufferedImage(jigsawWidth, jigsawHeight, jigsawImage.getType()); @@ -241,15 +242,13 @@ public CaptchaVO pictureTemplatesCut(BufferedImage originalImage, BufferedImage } } - /** * 随机生成拼图坐标 - * - * @param originalWidth - * @param originalHeight - * @param jigsawWidth - * @param jigsawHeight - * @return + * @param originalWidth originalWidth + * @param originalHeight originalHeight + * @param jigsawWidth jigsawWidth + * @param jigsawHeight jigsawHeight + * @return PointVO */ private static PointVO generateJigsawPoint(int originalWidth, int originalHeight, int jigsawWidth, int jigsawHeight) { Random random = new Random(); @@ -279,7 +278,6 @@ private static PointVO generateJigsawPoint(int originalWidth, int originalHeight * @param newImage 新抠出的小图 * @param x 随机扣取坐标X * @param y 随机扣取坐标y - * @throws Exception */ private static void cutByTemplate(BufferedImage oriImage, BufferedImage templateImage, BufferedImage newImage, int x, int y) { //临时数组遍历用于高斯模糊存周边像素值 @@ -327,7 +325,6 @@ private static void cutByTemplate(BufferedImage oriImage, BufferedImage template * @param templateImage 模板图 * @param x 随机扣取坐标X * @param y 随机扣取坐标y - * @throws Exception */ private static void interferenceByTemplate(BufferedImage oriImage, BufferedImage templateImage, int x, int y) { //临时数组遍历用于高斯模糊存周边像素值 diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaCacheServiceMemImpl.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaCacheServiceMemImpl.java index 6e381f4..5cdd309 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaCacheServiceMemImpl.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaCacheServiceMemImpl.java @@ -12,7 +12,7 @@ * * @author lide1202@hotmail.com * @Title: 默认使用内存当缓存 - * @date 2020-05-12 + * @Date 2020-05-12 */ public class CaptchaCacheServiceMemImpl implements CaptchaCacheService { @Override diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaServiceFactory.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaServiceFactory.java index f662532..6b9f652 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaServiceFactory.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaServiceFactory.java @@ -41,8 +41,8 @@ public static CaptchaCacheService getCache(String cacheType) { return cacheService.get(cacheType); } - public volatile static Map instances = new HashMap(); - public volatile static Map cacheService = new HashMap(); + public volatile static Map instances = new HashMap<>(); + public volatile static Map cacheService = new HashMap<>(); static { ServiceLoader cacheServices = ServiceLoader.load(CaptchaCacheService.class); diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/ClickWordCaptchaServiceImpl.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/ClickWordCaptchaServiceImpl.java index b599ec8..c071e97 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/ClickWordCaptchaServiceImpl.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/ClickWordCaptchaServiceImpl.java @@ -78,8 +78,7 @@ public ResponseModel get(CaptchaVO captchaVO) { return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_BASEMAP_NULL); } CaptchaVO imageData = getImageData(bufferedImage); - if (imageData == null - || StringUtils.isBlank(imageData.getOriginalImageBase64())) { + if (StringUtils.isBlank(imageData.getOriginalImageBase64())) { return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_ERROR); } return ResponseModel.successData(imageData); @@ -139,7 +138,7 @@ public ResponseModel check(CaptchaVO captchaVO) { } //校验成功,将信息存入缓存 String secretKey = point.get(0).getSecretKey(); - String value = null; + String value; try { value = AESUtil.aesEncrypt(captchaVO.getToken().concat("---").concat(pointJson), secretKey); } catch (Exception e) { @@ -296,7 +295,7 @@ private Set getRandomWords(int wordCount) { * @param imageHeight 图片高度 * @param wordSortIndex 字体循环排序下标(i) * @param wordCount 字数量 - * @return + * @return PointVO */ private static PointVO randomWordPoint(int imageWidth, int imageHeight, int wordSortIndex, int wordCount) { int avgWidth = imageWidth / (wordCount + 1); diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/FrequencyLimitHandler.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/FrequencyLimitHandler.java index ff455d7..478c2f9 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/FrequencyLimitHandler.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/FrequencyLimitHandler.java @@ -21,24 +21,24 @@ public interface FrequencyLimitHandler { /** * get 接口限流 * - * @param captchaVO - * @return + * @param captchaVO captchaVO + * @return ResponseModel */ ResponseModel validateGet(CaptchaVO captchaVO); /** * check接口限流 * - * @param captchaVO - * @return + * @param captchaVO captchaVO + * @return ResponseModel */ ResponseModel validateCheck(CaptchaVO captchaVO); /** * verify接口限流 * - * @param captchaVO - * @return + * @param captchaVO captchaVO + * @return ResponseModel */ ResponseModel validateVerify(CaptchaVO captchaVO); diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java index 03969f1..ecf695b 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java @@ -15,13 +15,15 @@ import java.util.Base64; public class AESUtil { - //算法 + /** + * 算法 + */ private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding"; /** * 获取随机key * - * @return + * @return 随机key */ public static String getKey() { return RandomUtils.getRandomString(16); @@ -36,7 +38,8 @@ public static String getKey() { * @return 转换后的字符串 */ public static String binary(byte[] bytes, int radix) { - return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数 + // 这里的1代表正数 + return new BigInteger(1, bytes).toString(radix); } /** @@ -46,7 +49,6 @@ public static String binary(byte[] bytes, int radix) { * @return 编码后的base 64 code */ public static String base64Encode(byte[] bytes) { - //return Base64.encodeBase64String(bytes); return Base64.getEncoder().encodeToString(bytes); } @@ -55,7 +57,7 @@ public static String base64Encode(byte[] bytes) { * * @param base64Code 待解码的base 64 code * @return 解码后的byte[] - * @throws Exception + * @throws Exception e */ public static byte[] base64Decode(String base64Code) throws Exception { Base64.Decoder decoder = Base64.getDecoder(); @@ -69,7 +71,7 @@ public static byte[] base64Decode(String base64Code) throws Exception { * @param content 待加密的内容 * @param encryptKey 加密密钥 * @return 加密后的byte[] - * @throws Exception + * @throws Exception e */ public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); @@ -87,7 +89,7 @@ public static byte[] aesEncryptToBytes(String content, String encryptKey) throws * @param content 待加密的内容 * @param encryptKey 加密密钥 * @return 加密后的base 64 code - * @throws Exception + * @throws Exception e */ public static String aesEncrypt(String content, String encryptKey) throws Exception { if (StringUtils.isBlank(encryptKey)) { @@ -102,7 +104,7 @@ public static String aesEncrypt(String content, String encryptKey) throws Except * @param encryptBytes 待解密的byte[] * @param decryptKey 解密密钥 * @return 解密后的String - * @throws Exception + * @throws Exception e */ public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); @@ -121,7 +123,7 @@ public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) t * @param encryptStr 待解密的base 64 code * @param decryptKey 解密密钥 * @return 解密后的string - * @throws Exception + * @throws Exception e */ public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception { if (StringUtils.isBlank(decryptKey)) { @@ -133,15 +135,15 @@ public static String aesDecrypt(String encryptStr, String decryptKey) throws Exc /** * 测试 */ - public static void main(String[] args) throws Exception { - String randomString = RandomUtils.getRandomString(16); - String content = "hahhahaahhahni"; - System.out.println("加密前:" + content); - System.out.println("加密密钥和解密密钥:" + randomString); - String encrypt = aesEncrypt(content, randomString); - System.out.println("加密后:" + encrypt); - String decrypt = aesDecrypt(encrypt, randomString); - System.out.println("解密后:" + decrypt); - } +// public static void main(String[] args) throws Exception { +// String randomString = RandomUtils.getRandomString(16); +// String content = "hahhahaahhahni"; +// System.out.println("加密前:" + content); +// System.out.println("加密密钥和解密密钥:" + randomString); +// String encrypt = aesEncrypt(content, randomString); +// System.out.println("加密后:" + encrypt); +// String decrypt = aesDecrypt(encrypt, randomString); +// System.out.println("解密后:" + decrypt); +// } } diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/FileCopyUtils.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/FileCopyUtils.java index da9017b..b0e4b63 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/FileCopyUtils.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/FileCopyUtils.java @@ -1,8 +1,4 @@ package com.xingyuv.captcha.util; -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// import java.io.*; import java.nio.file.Files; @@ -32,16 +28,13 @@ public static int copy(InputStream in, OutputStream out) throws IOException { } finally { try { in.close(); - } catch (IOException var12) { + } catch (IOException ignored) { } - try { out.close(); - } catch (IOException var11) { + } catch (IOException ignored) { } - } - return var2; } @@ -51,7 +44,7 @@ public static void copy(byte[] in, OutputStream out) throws IOException { } finally { try { out.close(); - } catch (IOException var8) { + } catch (IOException ignored) { } } @@ -83,12 +76,12 @@ public static int copy(Reader in, Writer out) throws IOException { } finally { try { in.close(); - } catch (IOException var15) { + } catch (IOException ignored) { } try { out.close(); - } catch (IOException var14) { + } catch (IOException ignored) { } } @@ -100,7 +93,7 @@ public static void copy(String in, Writer out) throws IOException { } finally { try { out.close(); - } catch (IOException var8) { + } catch (IOException ignored) { } } diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/ImageUtils.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/ImageUtils.java index f6daf89..5999d74 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/ImageUtils.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/ImageUtils.java @@ -22,9 +22,18 @@ public class ImageUtils { private static Logger logger = LoggerFactory.getLogger(ImageUtils.class); - private static Map originalCacheMap = new ConcurrentHashMap(); //滑块底图 - private static Map slidingBlockCacheMap = new ConcurrentHashMap(); //滑块 - private static Map picClickCacheMap = new ConcurrentHashMap(); //点选文字 + /** + * 滑块底图 + */ + private static Map originalCacheMap = new ConcurrentHashMap<>(); + /** + * 滑块 + */ + private static Map slidingBlockCacheMap = new ConcurrentHashMap<>(); + /** + * 点选文字 + */ + private static Map picClickCacheMap = new ConcurrentHashMap<>(); private static Map fileNameMap = new ConcurrentHashMap<>(); public static void cacheImage(String captchaOriginalPathJigsaw, String captchaOriginalPathClick) { @@ -91,8 +100,8 @@ public static BufferedImage getPicClick() { /** * 图片转base64 字符串 * - * @param templateImage - * @return + * @param templateImage templateImage + * @return base64 */ public static String getImageToBase64Str(BufferedImage templateImage) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -111,8 +120,8 @@ public static String getImageToBase64Str(BufferedImage templateImage) { /** * base64 字符串转图片 * - * @param base64String - * @return + * @param base64String base64String + * @return 图片 */ public static BufferedImage getBase64StrToImage(String base64String) { try { @@ -160,8 +169,6 @@ private static Map getImagesFile(String path) { byte[] bytes = FileCopyUtils.copyToByteArray(fileInputStream); String string = Base64Utils.encodeToString(bytes); imgMap.put(item.getName(), string); - } catch (FileNotFoundException e) { - e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/JsonUtil.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/JsonUtil.java index 66e29e7..e64ecb2 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/JsonUtil.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/JsonUtil.java @@ -61,7 +61,7 @@ public static String toJSONString(Object object) { if (object instanceof List) { List list = (List) object; StringBuilder buf = new StringBuilder("["); - list.stream().forEach(t -> { + list.forEach(t -> { buf.append(t.toJsonString()).append(","); }); return buf.deleteCharAt(buf.lastIndexOf(",")).append("]").toString(); diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/RandomUtils.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/RandomUtils.java index 7c134c3..b0a184e 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/RandomUtils.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/RandomUtils.java @@ -11,13 +11,12 @@ import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; - public class RandomUtils { /** * 生成UUID * - * @return + * @return UUID */ public static String getUUID() { String uuid = UUID.randomUUID().toString(); @@ -28,11 +27,10 @@ public static String getUUID() { /** * 获取指定文字的随机中文 * - * @return + * @return 随机中文 */ public static String getRandomHan(String hanZi) { - String ch = hanZi.charAt(new Random().nextInt(hanZi.length())) + ""; - return ch; + return hanZi.charAt(new Random().nextInt(hanZi.length())) + ""; } public static int getRandomInt(int bound) { @@ -42,7 +40,7 @@ public static int getRandomInt(int bound) { /** * 获取随机中文 * - * @return + * @return 随机中文 */ public static String getRandomHan() { String str = ""; @@ -51,8 +49,10 @@ public static String getRandomHan() { Random random = new Random(); - highCode = (176 + Math.abs(random.nextInt(39))); //B0 + 0~39(16~55) 一级汉字所占区 - lowCode = (161 + Math.abs(random.nextInt(93))); //A1 + 0~93 每区有94个汉字 + // B0 + 0~39(16~55) 一级汉字所占区 + highCode = (176 + Math.abs(random.nextInt(39))); + // A1 + 0~93 每区有94个汉字 + lowCode = (161 + Math.abs(random.nextInt(93))); byte[] b = new byte[2]; b[0] = (Integer.valueOf(highCode)).byteValue(); @@ -69,9 +69,9 @@ public static String getRandomHan() { /** * 随机范围内数字 * - * @param startNum - * @param endNum - * @return + * @param startNum 开始 + * @param endNum 结束 + * @return 随机数 */ public static Integer getRandomInt(int startNum, int endNum) { return ThreadLocalRandom.current().nextInt(endNum - startNum) + startNum; @@ -80,8 +80,8 @@ public static Integer getRandomInt(int startNum, int endNum) { /** * 获取随机字符串 * - * @param length - * @return + * @param length 长度 + * @return 随机字符串 */ public static String getRandomString(int length) { String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StreamUtils.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StreamUtils.java index 39545bb..e445350 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StreamUtils.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StreamUtils.java @@ -1,8 +1,4 @@ package com.xingyuv.captcha.util; -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by Fernflower decompiler) -// import java.io.*; import java.nio.charset.Charset; @@ -31,7 +27,6 @@ public static String copyToString(InputStream in, Charset charset) throws IOExce StringBuilder out = new StringBuilder(); InputStreamReader reader = new InputStreamReader(in, charset); char[] buffer = new char[4096]; - boolean var5 = true; int bytesRead; while ((bytesRead = reader.read(buffer)) != -1) { diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StringUtils.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StringUtils.java index 2df3828..efa2558 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StringUtils.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/StringUtils.java @@ -6,6 +6,8 @@ */ package com.xingyuv.captcha.util; +import java.util.Objects; + public class StringUtils { /** @@ -536,7 +538,7 @@ public static String[] stripAll(String[] strs, String stripChars) { * @see java.lang.String#equals(Object) */ public static boolean equals(String str1, String str2) { - return str1 == null ? str2 == null : str1.equals(str2); + return Objects.equals(str1, str2); } /** diff --git a/core/captcha-plus/src/main/resources/defaultImages/jigsaw/original/bg8.png b/core/captcha-plus/src/main/resources/defaultImages/jigsaw/original/bg8.png deleted file mode 100644 index 5ea54d482a51be9be86fa7c448d004daf1eb78c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74254 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 org.springframework.boot spring-boot-starter-parent - 2.7.7 + 2.7.8 com.xingyuv spring-boot-starter-captcha-plus - 1.0.1 + 1.0.2 spring-boot-starter-captcha-plus spring-boot-starter-captcha-plus @@ -21,7 +21,7 @@ 1.8 - 2.7.7 + 2.7.8 @@ -29,7 +29,7 @@ com.xingyuv captcha-plus - 1.0.1 + 1.0.2 org.springframework.boot diff --git a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java index 49a1fdc..313f471 100644 --- a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java +++ b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java @@ -29,9 +29,9 @@ public class AjCaptchaProperties { /** - * 右下角水印文字(我的水印). + * 右下角水印文字(captcha-plus). */ - private String waterMark = "我的水印"; + private String waterMark = "captcha-plus"; /** * 右下角水印字体(文泉驿正黑). diff --git a/pom.xml b/pom.xml index 544de17..8bc070e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,12 +6,12 @@ com.xingyuv captcha-plus-parent - 1.0.1 + 1.0.2 pom - 2.7.7 - 1.0.1 + 2.7.8 + 1.0.2 1.8 1.8 UTF-8 diff --git a/view/doc/docs/captchaDoc/java.md b/view/doc/docs/captchaDoc/java.md index 7e80a0d..c338886 100644 --- a/view/doc/docs/captchaDoc/java.md +++ b/view/doc/docs/captchaDoc/java.md @@ -7,7 +7,7 @@ a.引入jar,已上传至maven中央仓库。 com.xingyuv spring-boot-starter-captcha-plus - 1.0.1 + 1.0.2 ``` b.修改application.properties,自定义底图和水印,启动后前端就可以请求接口了。[社区底图库](https://gitee.com/anji-plus/AJ-Captcha-Images)