* Created by raodeming on 2019/12/25.
*/
+@Slf4j
public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
@Override
@@ -34,10 +37,10 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
super.init(config);
}
- @Override
- public void destroy(Properties config) {
- logger.info("start-clear-history-data-",captchaType());
- }
+ @Override
+ public void destroy(Properties config) {
+ log.info("start-clear-history-data-", captchaType());
+ }
@Override
public String captchaType() {
@@ -46,14 +49,14 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
@Override
public ResponseModel get(CaptchaVO captchaVO) {
- ResponseModel r = super.get(captchaVO);
- if(!validatedReq(r)){
- return r;
- }
+ ResponseModel r = super.get(captchaVO);
+ if (!validatedReq(r)) {
+ return r;
+ }
//原生图片
BufferedImage originalImage = ImageUtils.getOriginal();
if (null == originalImage) {
- logger.error("滑动底图未初始化成功,请检查路径");
+ log.error("滑动底图未初始化成功,请检查路径");
return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_BASEMAP_NULL);
}
//设置水印
@@ -68,13 +71,13 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
String jigsawImageBase64 = ImageUtils.getslidingBlock();
BufferedImage jigsawImage = ImageUtils.getBase64StrToImage(jigsawImageBase64);
if (null == jigsawImage) {
- logger.error("滑动底图未初始化成功,请检查路径");
+ log.error("滑动底图未初始化成功,请检查路径");
return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_BASEMAP_NULL);
}
CaptchaVO captcha = pictureTemplatesCut(originalImage, jigsawImage, jigsawImageBase64);
if (captcha == null
- || StringUtils.isBlank(captcha.getJigsawImageBase64())
- || StringUtils.isBlank(captcha.getOriginalImageBase64())) {
+ || StrUtil.isBlank(captcha.getJigsawImageBase64())
+ || StrUtil.isBlank(captcha.getOriginalImageBase64())) {
return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_ERROR);
}
return ResponseModel.successData(captcha);
@@ -82,10 +85,10 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
@Override
public ResponseModel check(CaptchaVO captchaVO) {
- ResponseModel r = super.check(captchaVO);
- if(!validatedReq(r)){
- return r;
- }
+ ResponseModel r = super.check(captchaVO);
+ if (!validatedReq(r)) {
+ return r;
+ }
//取坐标信息
String codeKey = String.format(REDIS_CAPTCHA_KEY, captchaVO.getToken());
if (!CaptchaServiceFactory.getCache(cacheType).exists(codeKey)) {
@@ -103,7 +106,7 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
pointJson = decrypt(captchaVO.getPointJson(), point.getSecretKey());
point1 = JsonUtil.parseObject(pointJson, PointVO.class);
} catch (Exception e) {
- logger.error("验证码坐标解析失败", e);
+ log.error("验证码坐标解析失败", e);
afterValidateFail(captchaVO);
return ResponseModel.errorMsg(e.getMessage());
}
@@ -119,7 +122,7 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
try {
value = AESUtil.aesEncrypt(captchaVO.getToken().concat("---").concat(pointJson), secretKey);
} catch (Exception e) {
- logger.error("AES加密失败", e);
+ log.error("AES加密失败", e);
afterValidateFail(captchaVO);
return ResponseModel.errorMsg(e.getMessage());
}
@@ -132,10 +135,10 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
@Override
public ResponseModel verification(CaptchaVO captchaVO) {
- ResponseModel r = super.verification(captchaVO);
- if(!validatedReq(r)){
- return r;
- }
+ ResponseModel r = super.verification(captchaVO);
+ if (!validatedReq(r)) {
+ return r;
+ }
try {
String codeKey = String.format(REDIS_SECOND_CAPTCHA_KEY, captchaVO.getCaptchaVerification());
if (!CaptchaServiceFactory.getCache(cacheType).exists(codeKey)) {
@@ -144,7 +147,7 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
//二次校验取值后,即刻失效
CaptchaServiceFactory.getCache(cacheType).delete(codeKey);
} catch (Exception e) {
- logger.error("验证码坐标解析失败", e);
+ log.error("验证码坐标解析失败", e);
return ResponseModel.errorMsg(e.getMessage());
}
return ResponseModel.success();
@@ -234,7 +237,7 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService {
//将坐标信息存入redis中
String codeKey = String.format(REDIS_CAPTCHA_KEY, dataVO.getToken());
CaptchaServiceFactory.getCache(cacheType).set(codeKey, JsonUtil.toJSONString(point), EXPIRESIN_SECONDS);
- logger.debug("token:{},point:{}", dataVO.getToken(), JsonUtil.toJSONString(point));
+ log.debug("token:{},point:{}", dataVO.getToken(), JsonUtil.toJSONString(point));
return dataVO;
} catch (Exception e) {
e.printStackTrace();
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaCacheServiceMemImpl.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaCacheServiceMemImpl.java
index 264c6c09cd..7739b1a4bb 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaCacheServiceMemImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaCacheServiceMemImpl.java
@@ -3,12 +3,15 @@ package com.anji.captcha.service.impl;
import com.anji.captcha.service.CaptchaCacheService;
import com.anji.captcha.util.CacheUtil;
+import java.util.Objects;
+
/**
* 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis,参考service/spring-boot代码示例。
* 如果应用是单点的,也没有使用redis,那默认使用内存。
* 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。
- * @Title: 默认使用内存当缓存
+ *
* @author lide1202@hotmail.com
+ * @Title: 默认使用内存当缓存
* @date 2020-05-12
*/
public class CaptchaCacheServiceMemImpl implements CaptchaCacheService {
@@ -33,14 +36,14 @@ public class CaptchaCacheServiceMemImpl implements CaptchaCacheService {
return CacheUtil.get(key);
}
- @Override
- public Long increment(String key, long val) {
- Long ret = Long.valueOf(CacheUtil.get(key))+val;
- CacheUtil.set(key,ret+"",0);
- return ret;
- }
+ @Override
+ public Long increment(String key, long val) {
+ Long ret = Long.parseLong(Objects.requireNonNull(CacheUtil.get(key))) + val;
+ CacheUtil.set(key, ret + "", 0);
+ return ret;
+ }
- @Override
+ @Override
public String type() {
return "local";
}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaServiceFactory.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaServiceFactory.java
index 6f3ff70faf..ceb91391a4 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaServiceFactory.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/CaptchaServiceFactory.java
@@ -3,8 +3,7 @@ package com.anji.captcha.service.impl;
import com.anji.captcha.model.common.Const;
import com.anji.captcha.service.CaptchaCacheService;
import com.anji.captcha.service.CaptchaService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
@@ -14,10 +13,9 @@ import java.util.ServiceLoader;
/**
* Created by raodeming on 2020/5/26.
*/
+@Slf4j
public class CaptchaServiceFactory {
- private static Logger logger = LoggerFactory.getLogger(CaptchaServiceFactory.class);
-
public static CaptchaService getInstance(Properties config) {
//先把所有CaptchaService初始化,通过init方法,实例字体等,add by lide1202@hotmail.com
/*try{
@@ -41,20 +39,20 @@ public class CaptchaServiceFactory {
return cacheService.get(cacheType);
}
- public volatile static Map
* Created by raodeming on 2019/12/25.
*/
+@Slf4j
public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
public static String HAN_ZI = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";
@@ -43,27 +46,27 @@ public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
super.init(config);
clickWordFontStr = config.getProperty(Const.CAPTCHA_FONT_TYPE, "SourceHanSansCN-Normal.otf");
try {
- int size = Integer.valueOf(config.getProperty(Const.CAPTCHA_FONT_SIZE,HAN_ZI_SIZE+""));
+ int size = Integer.parseInt(config.getProperty(Const.CAPTCHA_FONT_SIZE,HAN_ZI_SIZE+""));
if (clickWordFontStr.toLowerCase().endsWith(".ttf")
|| clickWordFontStr.toLowerCase().endsWith(".ttc")
|| clickWordFontStr.toLowerCase().endsWith(".otf")) {
this.clickWordFont = Font.createFont(Font.TRUETYPE_FONT,
- getClass().getResourceAsStream("/fonts/" + clickWordFontStr))
+ Objects.requireNonNull(getClass().getResourceAsStream("/fonts/" + clickWordFontStr)))
.deriveFont(Font.BOLD, size);
} else {
- int style = Integer.valueOf(config.getProperty(Const.CAPTCHA_FONT_STYLE,Font.BOLD+""));
+ int style = Integer.parseInt(config.getProperty(Const.CAPTCHA_FONT_STYLE,Font.BOLD+""));
this.clickWordFont = new Font(clickWordFontStr, style, size);
}
} catch (Exception ex) {
- logger.error("load font error:{}", ex);
+ log.error("load font error:{}", ex);
}
- this.wordTotalCount = Integer.valueOf(config.getProperty(Const.CAPTCHA_WORD_COUNT,"4"));
+ this.wordTotalCount = Integer.parseInt(config.getProperty(Const.CAPTCHA_WORD_COUNT,"4"));
}
@Override
public void destroy(Properties config) {
- logger.info("start-clear-history-data-", captchaType());
+ log.info("start-clear-history-data-", captchaType());
}
@Override
@@ -74,12 +77,12 @@ public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
}
BufferedImage bufferedImage = ImageUtils.getPicClick();
if (null == bufferedImage) {
- logger.error("滑动底图未初始化成功,请检查路径");
+ log.error("滑动底图未初始化成功,请检查路径");
return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_BASEMAP_NULL);
}
CaptchaVO imageData = getImageData(bufferedImage);
if (imageData == null
- || StringUtils.isBlank(imageData.getOriginalImageBase64())) {
+ || StrUtil.isBlank(imageData.getOriginalImageBase64())) {
return ResponseModel.errorMsg(RepCodeEnum.API_CAPTCHA_ERROR);
}
return ResponseModel.successData(imageData);
@@ -124,7 +127,7 @@ public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
pointJson = decrypt(captchaVO.getPointJson(), point.get(0).getSecretKey());
point1 = JsonUtil.parseArray(pointJson, PointVO.class);
} catch (Exception e) {
- logger.error("验证码坐标解析失败", e);
+ log.error("验证码坐标解析失败", e);
afterValidateFail(captchaVO);
return ResponseModel.errorMsg(e.getMessage());
}
@@ -143,7 +146,7 @@ public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
try {
value = AESUtil.aesEncrypt(captchaVO.getToken().concat("---").concat(pointJson), secretKey);
} catch (Exception e) {
- logger.error("AES加密失败", e);
+ log.error("AES加密失败", e);
afterValidateFail(captchaVO);
return ResponseModel.errorMsg(e.getMessage());
}
@@ -159,7 +162,7 @@ public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
/*if (captchaVO == null) {
return RepCodeEnum.NULL_ERROR.parseError("captchaVO");
}
- if (StringUtils.isEmpty(captchaVO.getCaptchaVerification())) {
+ if (StrUtil.isEmpty(captchaVO.getCaptchaVerification())) {
return RepCodeEnum.NULL_ERROR.parseError("captchaVerification");
}*/
ResponseModel r = super.verification(captchaVO);
@@ -174,7 +177,7 @@ public class ClickWordCaptchaServiceImpl extends AbstractCaptchaService {
//二次校验取值后,即刻失效
CaptchaServiceFactory.getCache(cacheType).delete(codeKey);
} catch (Exception e) {
- logger.error("验证码坐标解析失败", e);
+ log.error("验证码坐标解析失败", e);
return ResponseModel.errorMsg(e.getMessage());
}
return ResponseModel.success();
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/DefaultCaptchaServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/DefaultCaptchaServiceImpl.java
index 18c2180e66..e9843765a1 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/DefaultCaptchaServiceImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/DefaultCaptchaServiceImpl.java
@@ -6,17 +6,19 @@
*/
package com.anji.captcha.service.impl;
+import cn.hutool.core.util.StrUtil;
import com.anji.captcha.model.common.RepCodeEnum;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
-import com.anji.captcha.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
import java.util.Properties;
/**
* Created by raodeming on 2019/12/25.
*/
+@Slf4j
public class DefaultCaptchaServiceImpl extends AbstractCaptchaService{
@Override
@@ -53,7 +55,7 @@ public class DefaultCaptchaServiceImpl extends AbstractCaptchaService{
if (captchaVO == null) {
return RepCodeEnum.NULL_ERROR.parseError("captchaVO");
}
- if (StringUtils.isEmpty(captchaVO.getCaptchaType())) {
+ if (StrUtil.isEmpty(captchaVO.getCaptchaType())) {
return RepCodeEnum.NULL_ERROR.parseError("类型");
}
return getService(captchaVO.getCaptchaType()).get(captchaVO);
@@ -64,10 +66,10 @@ public class DefaultCaptchaServiceImpl extends AbstractCaptchaService{
if (captchaVO == null) {
return RepCodeEnum.NULL_ERROR.parseError("captchaVO");
}
- if (StringUtils.isEmpty(captchaVO.getCaptchaType())) {
+ if (StrUtil.isEmpty(captchaVO.getCaptchaType())) {
return RepCodeEnum.NULL_ERROR.parseError("类型");
}
- if (StringUtils.isEmpty(captchaVO.getToken())) {
+ if (StrUtil.isEmpty(captchaVO.getToken())) {
return RepCodeEnum.NULL_ERROR.parseError("token");
}
return getService(captchaVO.getCaptchaType()).check(captchaVO);
@@ -78,7 +80,7 @@ public class DefaultCaptchaServiceImpl extends AbstractCaptchaService{
if (captchaVO == null) {
return RepCodeEnum.NULL_ERROR.parseError("captchaVO");
}
- if (StringUtils.isEmpty(captchaVO.getCaptchaVerification())) {
+ if (StrUtil.isEmpty(captchaVO.getCaptchaVerification())) {
return RepCodeEnum.NULL_ERROR.parseError("二次校验参数");
}
try {
@@ -89,7 +91,7 @@ public class DefaultCaptchaServiceImpl extends AbstractCaptchaService{
//二次校验取值后,即刻失效
CaptchaServiceFactory.getCache(cacheType).delete(codeKey);
} catch (Exception e) {
- logger.error("验证码坐标解析失败", e);
+ log.error("验证码坐标解析失败", e);
return ResponseModel.errorMsg(e.getMessage());
}
return ResponseModel.success();
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/FrequencyLimitHandler.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/FrequencyLimitHandler.java
index ffbceb5a91..a477db2f98 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/FrequencyLimitHandler.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/service/impl/FrequencyLimitHandler.java
@@ -1,11 +1,11 @@
package com.anji.captcha.service.impl;
+import cn.hutool.core.util.StrUtil;
import com.anji.captcha.model.common.Const;
import com.anji.captcha.model.common.RepCodeEnum;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaCacheService;
-import com.anji.captcha.util.StringUtils;
import java.util.Objects;
import java.util.Properties;
@@ -66,15 +66,15 @@ public interface FrequencyLimitHandler {
}
private String getClientCId(CaptchaVO input, String type) {
- return String.format(LIMIT_KEY ,type,input.getClientUid());
+ return String.format(LIMIT_KEY, type, input.getClientUid());
}
@Override
public ResponseModel validateGet(CaptchaVO d) {
- // 无客户端身份标识,不限制
- if(StringUtils.isEmpty(d.getClientUid())){
- return null;
- }
+ // 无客户端身份标识,不限制
+ if (StrUtil.isEmpty(d.getClientUid())) {
+ return null;
+ }
String getKey = getClientCId(d, "GET");
String lockKey = getClientCId(d, "LOCK");
// 失败次数过多,锁定
@@ -88,7 +88,7 @@ public interface FrequencyLimitHandler {
}
cacheService.increment(getKey, 1);
// 1分钟内请求次数过多
- if (Long.valueOf(getCnts) > Long.parseLong(config.getProperty(Const.REQ_GET_MINUTE_LIMIT, "120"))) {
+ if (Long.parseLong(getCnts) > Long.parseLong(config.getProperty(Const.REQ_GET_MINUTE_LIMIT, "120"))) {
return ResponseModel.errorMsg(RepCodeEnum.API_REQ_LIMIT_GET_ERROR);
}
@@ -100,9 +100,9 @@ public interface FrequencyLimitHandler {
return null;
}
// 1分钟内失败5次
- if (Long.valueOf(failCnts) > Long.parseLong(config.getProperty(Const.REQ_GET_LOCK_LIMIT, "5"))) {
+ if (Long.parseLong(failCnts) > Long.parseLong(config.getProperty(Const.REQ_GET_LOCK_LIMIT, "5"))) {
// get接口锁定5分钟
- cacheService.set(lockKey, "1", Long.valueOf(config.getProperty(Const.REQ_GET_LOCK_SECONDS, "300")));
+ cacheService.set(lockKey, "1", Long.parseLong(config.getProperty(Const.REQ_GET_LOCK_SECONDS, "300")));
return ResponseModel.errorMsg(RepCodeEnum.API_REQ_LOCK_GET_ERROR);
}
return null;
@@ -110,10 +110,10 @@ public interface FrequencyLimitHandler {
@Override
public ResponseModel validateCheck(CaptchaVO d) {
- // 无客户端身份标识,不限制
- if(StringUtils.isEmpty(d.getClientUid())){
- return null;
- }
+ // 无客户端身份标识,不限制
+ if (StrUtil.isEmpty(d.getClientUid())) {
+ return null;
+ }
/*String getKey = getClientCId(d, "GET");
if(Objects.isNull(cacheService.get(getKey))){
return ResponseModel.errorMsg(RepCodeEnum.API_REQ_INVALID);
@@ -125,7 +125,7 @@ public interface FrequencyLimitHandler {
v = "1";
}
cacheService.increment(key, 1);
- if (Long.valueOf(v) > Long.valueOf(config.getProperty(Const.REQ_CHECK_MINUTE_LIMIT, "600"))) {
+ if (Long.parseLong(v) > Long.parseLong(config.getProperty(Const.REQ_CHECK_MINUTE_LIMIT, "600"))) {
return ResponseModel.errorMsg(RepCodeEnum.API_REQ_LIMIT_CHECK_ERROR);
}
return null;
@@ -144,7 +144,7 @@ public interface FrequencyLimitHandler {
v = "1";
}
cacheService.increment(key, 1);
- if (Long.valueOf(v) > Long.valueOf(config.getProperty(Const.REQ_VALIDATE_MINUTE_LIMIT, "600"))) {
+ if (Long.parseLong(v) > Long.parseLong(config.getProperty(Const.REQ_VALIDATE_MINUTE_LIMIT, "600"))) {
return ResponseModel.errorMsg(RepCodeEnum.API_REQ_LIMIT_VERIFY_ERROR);
}
return null;
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/AESUtil.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/AESUtil.java
index d8ea95b8d4..07cc86f54d 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/AESUtil.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/AESUtil.java
@@ -7,10 +7,13 @@
package com.anji.captcha.util;
+import cn.hutool.core.util.StrUtil;
+
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
import java.util.Base64;
@@ -20,6 +23,7 @@ public class AESUtil {
/**
* 获取随机key
+ *
* @return
*/
public static String getKey() {
@@ -29,39 +33,43 @@ public class AESUtil {
/**
* 将byte[]转为各种进制的字符串
+ *
* @param bytes byte[]
* @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制
* @return 转换后的字符串
*/
- public static String binary(byte[] bytes, int radix){
+ public static String binary(byte[] bytes, int radix) {
return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数
}
/**
* base 64 encode
+ *
* @param bytes 待编码的byte[]
* @return 编码后的base 64 code
*/
- public static String base64Encode(byte[] bytes){
+ public static String base64Encode(byte[] bytes) {
//return Base64.encodeBase64String(bytes);
return Base64.getEncoder().encodeToString(bytes);
}
/**
* base 64 decode
+ *
* @param base64Code 待解码的base 64 code
* @return 解码后的byte[]
* @throws Exception
*/
- public static byte[] base64Decode(String base64Code) throws Exception{
+ public static byte[] base64Decode(String base64Code) throws Exception {
Base64.Decoder decoder = Base64.getDecoder();
- return StringUtils.isEmpty(base64Code) ? null : decoder.decode(base64Code);
+ return StrUtil.isEmpty(base64Code) ? null : decoder.decode(base64Code);
}
/**
* AES加密
- * @param content 待加密的内容
+ *
+ * @param content 待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的byte[]
* @throws Exception
@@ -72,19 +80,20 @@ public class AESUtil {
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
- return cipher.doFinal(content.getBytes("utf-8"));
+ return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
}
/**
* AES加密为base 64 code
- * @param content 待加密的内容
+ *
+ * @param content 待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的base 64 code
* @throws Exception
*/
public static String aesEncrypt(String content, String encryptKey) throws Exception {
- if (StringUtils.isBlank(encryptKey)) {
+ if (StrUtil.isBlank(encryptKey)) {
return content;
}
return base64Encode(aesEncryptToBytes(content, encryptKey));
@@ -92,8 +101,9 @@ public class AESUtil {
/**
* AES解密
+ *
* @param encryptBytes 待解密的byte[]
- * @param decryptKey 解密密钥
+ * @param decryptKey 解密密钥
* @return 解密后的String
* @throws Exception
*/
@@ -110,16 +120,17 @@ public class AESUtil {
/**
* 将base 64 code AES解密
+ *
* @param encryptStr 待解密的base 64 code
* @param decryptKey 解密密钥
* @return 解密后的string
* @throws Exception
*/
public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
- if (StringUtils.isBlank(decryptKey)) {
+ if (StrUtil.isBlank(decryptKey)) {
return encryptStr;
}
- return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
+ return StrUtil.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
}
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/Base64Utils.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/Base64Utils.java
deleted file mode 100644
index 756689ed90..0000000000
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/Base64Utils.java
+++ /dev/null
@@ -1,53 +0,0 @@
-//
-// Source code recreated from a .class file by IntelliJ IDEA
-// (powered by Fernflower decompiler)
-//
-
-package com.anji.captcha.util;
-
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-
-public abstract class Base64Utils {
- private static final Charset DEFAULT_CHARSET;
-
- public Base64Utils() {
- }
-
- public static byte[] encode(byte[] src) {
- return src.length == 0 ? src : Base64.getEncoder().encode(src);
- }
-
- public static byte[] decode(byte[] src) {
- return src.length == 0 ? src : Base64.getDecoder().decode(src);
- }
-
- public static byte[] encodeUrlSafe(byte[] src) {
- return src.length == 0 ? src : Base64.getUrlEncoder().encode(src);
- }
-
- public static byte[] decodeUrlSafe(byte[] src) {
- return src.length == 0 ? src : Base64.getUrlDecoder().decode(src);
- }
-
- public static String encodeToString(byte[] src) {
- return src.length == 0 ? "" : new String(encode(src), DEFAULT_CHARSET);
- }
-
- public static byte[] decodeFromString(String src) {
- return src.isEmpty() ? new byte[0] : decode(src.getBytes(DEFAULT_CHARSET));
- }
-
- public static String encodeToUrlSafeString(byte[] src) {
- return new String(encodeUrlSafe(src), DEFAULT_CHARSET);
- }
-
- public static byte[] decodeFromUrlSafeString(String src) {
- return decodeUrlSafe(src.getBytes(DEFAULT_CHARSET));
- }
-
- static {
- DEFAULT_CHARSET = StandardCharsets.UTF_8;
- }
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/CacheUtil.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/CacheUtil.java
index 5f0fd450ca..617993526b 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/CacheUtil.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/CacheUtil.java
@@ -24,8 +24,9 @@ public final class CacheUtil {
/**
* 初始化
+ *
* @param cacheMaxNumber 缓存最大个数
- * @param second 定时任务 秒执行清除过期缓存
+ * @param second 定时任务 秒执行清除过期缓存
*/
public static void init(int cacheMaxNumber, long second) {
CACHE_MAX_NUMBER = cacheMaxNumber;
@@ -37,27 +38,25 @@ public final class CacheUtil {
refresh();
}
}, 0, second * 1000);*/
- scheduledExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- return new Thread(r,"thd-captcha-cache-clean");
- }
- },new ThreadPoolExecutor.CallerRunsPolicy());
+ ScheduledExecutorService scheduledExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable r) {
+ return new Thread(r, "thd-captcha-cache-clean");
+ }
+ }, new ThreadPoolExecutor.CallerRunsPolicy());
scheduledExecutor.scheduleAtFixedRate(new Runnable() {
- @Override
- public void run() {
- refresh();
- }
- },10,second,TimeUnit.SECONDS);
+ @Override
+ public void run() {
+ refresh();
+ }
+ }, 10, second, TimeUnit.SECONDS);
}
}
- private static ScheduledExecutorService scheduledExecutor;
-
/**
* 缓存刷新,清除过期数据
*/
- public static void refresh(){
+ public static void refresh() {
logger.debug("local缓存刷新,清除过期数据");
for (String key : CACHE_MAP.keySet()) {
exists(key);
@@ -65,24 +64,24 @@ public final class CacheUtil {
}
- public static void set(String key, String value, long expiresInSeconds){
+ public static void set(String key, String value, long expiresInSeconds) {
//设置阈值,达到即clear缓存
if (CACHE_MAP.size() > CACHE_MAX_NUMBER * 2) {
logger.info("CACHE_MAP达到阈值,clear map");
clear();
}
CACHE_MAP.put(key, value);
- if(expiresInSeconds >0) {
- CACHE_MAP.put(key + "_HoldTime", System.currentTimeMillis() + expiresInSeconds * 1000);//缓存失效时间
- }
+ if (expiresInSeconds > 0) {
+ CACHE_MAP.put(key + "_HoldTime", System.currentTimeMillis() + expiresInSeconds * 1000);//缓存失效时间
+ }
}
- public static void delete(String key){
+ public static void delete(String key) {
CACHE_MAP.remove(key);
CACHE_MAP.remove(key + "_HoldTime");
}
- public static boolean exists(String key){
+ public static boolean exists(String key) {
Long cacheHoldTime = (Long) CACHE_MAP.get(key + "_HoldTime");
if (cacheHoldTime == null || cacheHoldTime == 0L) {
return false;
@@ -95,9 +94,9 @@ public final class CacheUtil {
}
- public static String get(String key){
+ public static String get(String key) {
if (exists(key)) {
- return (String)CACHE_MAP.get(key);
+ return (String) CACHE_MAP.get(key);
}
return null;
}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/FileCopyUtils.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/FileCopyUtils.java
index a3d82db41f..057caa921d 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/FileCopyUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/FileCopyUtils.java
@@ -18,7 +18,7 @@ public abstract class FileCopyUtils {
}
public static void copy(byte[] in, File out) throws IOException {
- copy((InputStream)(new ByteArrayInputStream(in)), (OutputStream)Files.newOutputStream(out.toPath()));
+ copy((InputStream) (new ByteArrayInputStream(in)), (OutputStream) Files.newOutputStream(out.toPath()));
}
public static byte[] copyToByteArray(File in) throws IOException {
@@ -63,7 +63,7 @@ public abstract class FileCopyUtils {
return new byte[0];
} else {
ByteArrayOutputStream out = new ByteArrayOutputStream(4096);
- copy((InputStream)in, (OutputStream)out);
+ copy((InputStream) in, (OutputStream) out);
return out.toByteArray();
}
}
@@ -74,13 +74,12 @@ public abstract class FileCopyUtils {
char[] buffer = new char[4096];
int bytesRead;
- for(boolean var4 = true; (bytesRead = in.read(buffer)) != -1; byteCount += bytesRead) {
+ for (boolean var4 = true; (bytesRead = in.read(buffer)) != -1; byteCount += bytesRead) {
out.write(buffer, 0, bytesRead);
}
out.flush();
- int var5 = byteCount;
- return var5;
+ return byteCount;
} finally {
try {
in.close();
@@ -113,7 +112,7 @@ public abstract class FileCopyUtils {
return "";
} else {
StringWriter out = new StringWriter();
- copy((Reader)in, (Writer)out);
+ copy((Reader) in, (Writer) out);
return out.toString();
}
}
diff --git a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/ImageUtils.java b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/ImageUtils.java
index 9d9d88afe3..0e822cccdf 100644
--- a/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/ImageUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-captcha/src/main/java/com/anji/captcha/util/ImageUtils.java
@@ -6,9 +6,10 @@
*/
package com.anji.captcha.util;
+import cn.hutool.core.util.StrUtil;
import com.anji.captcha.model.common.CaptchaBaseMapEnum;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.Base64Utils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
@@ -19,9 +20,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-
+@Slf4j
public class ImageUtils {
- private static Logger logger = LoggerFactory.getLogger(ImageUtils.class);
private static Map The maximum size to which the padding constant(s) can expand. This constructor is public to permit tools that require a JavaBean
- * instance to operate. Checks if a String is empty ("") or null. NOTE: This method changed in Lang version 2.0.
- * It no longer trims the String.
- * That functionality is available in isBlank(). Checks if a String is not empty ("") and not null. Checks if a String is whitespace, empty ("") or null. Checks if a String is not empty (""), not null and not whitespace only. Removes control characters (char <= 32) from both
- * ends of this String, handling Removes control characters (char <= 32) from both
- * ends of this String, handling The String is trimmed using {@link String#trim()}.
- * Trim removes start and end characters <= 32.
- * To strip whitespace use {@link #strip(String)}. To trim your choice of characters, use the
- * {@link #strip(String, String)} methods. Removes control characters (char <= 32) from both
- * ends of this String returning The String is trimmed using {@link String#trim()}.
- * Trim removes start and end characters <= 32.
- * To strip whitespace use {@link #stripToNull(String)}. Removes control characters (char <= 32) from both
- * ends of this String returning an empty String ("") if the String
- * is empty ("") after the trim or if it is The String is trimmed using {@link String#trim()}.
- * Trim removes start and end characters <= 32.
- * To strip whitespace use {@link #stripToEmpty(String)}. Strips whitespace from the start and end of a String. This is similar to {@link #trim(String)} but removes whitespace.
- * Whitespace is defined by {@link Character#isWhitespace(char)}. A Strips whitespace from the start and end of a String returning
- * This is similar to {@link #trimToNull(String)} but removes whitespace.
- * Whitespace is defined by {@link Character#isWhitespace(char)}. Strips whitespace from the start and end of a String returning
- * an empty String if This is similar to {@link #trimToEmpty(String)} but removes whitespace.
- * Whitespace is defined by {@link Character#isWhitespace(char)}. Strips any of a set of characters from the start and end of a String.
- * This is similar to {@link String#trim()} but allows the characters
- * to be stripped to be controlled. A If the stripChars String is Strips any of a set of characters from the start of a String. A If the stripChars String is Strips any of a set of characters from the end of a String. A If the stripChars String is Strips whitespace from the start and end of every String in an array.
- * Whitespace is defined by {@link Character#isWhitespace(char)}. A new array is returned each time, except for length zero.
- * A Strips any of a set of characters from the start and end of every
- * String in an array. A new array is returned each time, except for length zero.
- * A Compares two Strings, returning Compares two Strings, returning Finds the first index within a String, handling A Finds the first index within a String from a start position,
- * handling A Finds the first index within a String, handling A Finds the n-th index within a String, handling A Note that 'head(String str, int n)' may be implemented as: Finds the n-th index within a String, handling A Finds the first index within a String, handling A Case in-sensitive find of the first index within a String. A Case in-sensitive find of the first index within a String
- * from the specified position. A Finds the last index within a String, handling A Finds the last index within a String from a start position,
- * handling A Finds the last index within a String, handling A Finds the n-th last index within a String, handling A Note that 'tail(String str, int n)' may be implemented as: Finds the first index within a String, handling A Case in-sensitive find of the last index within a String. A Case in-sensitive find of the last index within a String
- * from the specified position. A Checks if String contains a search character, handling A Checks if String contains a search String, handling A Checks if String contains a search String irrespective of case,
- * handling A Find the first index of any of a set of potential substrings. A Find the latest index of any of a set of potential substrings. A Gets a substring from the specified String avoiding exceptions. A negative start position can be used to start A Gets a substring from the specified String avoiding exceptions. A negative start position can be used to start/end The returned substring starts with the character in the If Gets the leftmost If Gets the rightmost If Gets If Gets the substring before the first occurrence of a separator.
- * The separator is not returned. A If nothing is found, the string input is returned. Gets the substring after the first occurrence of a separator.
- * The separator is not returned. A If nothing is found, the empty string is returned. Gets the substring before the last occurrence of a separator.
- * The separator is not returned. A If nothing is found, the string input is returned. Gets the substring after the last occurrence of a separator.
- * The separator is not returned. A If nothing is found, the empty string is returned. Gets the String that is nested in between two instances of the
- * same String. A Gets the String that is nested in between two Strings.
- * Only the first match is returned. A "".
- * @since 2.0
- */
- public static final String EMPTY = "";
-
- /**
- * Represents a failed index search.
- * @since 2.1
- */
- public static final int INDEX_NOT_FOUND = -1;
-
- /**
- * StringUtils instances should NOT be constructed in
- * standard programming. Instead, the class should be used as
- * StringUtils.trim(" foo ");.
- * StringUtils.isEmpty(null) = true
- * StringUtils.isEmpty("") = true
- * StringUtils.isEmpty(" ") = false
- * StringUtils.isEmpty("bob") = false
- * StringUtils.isEmpty(" bob ") = false
- *
- *
- * true if the String is empty or null
- */
- public static boolean isEmpty(String str) {
- return str == null || str.length() == 0;
- }
-
- /**
- *
- * StringUtils.isNotEmpty(null) = false
- * StringUtils.isNotEmpty("") = false
- * StringUtils.isNotEmpty(" ") = true
- * StringUtils.isNotEmpty("bob") = true
- * StringUtils.isNotEmpty(" bob ") = true
- *
- *
- * @param str the String to check, may be null
- * @return true if the String is not empty and not null
- */
- public static boolean isNotEmpty(String str) {
- return !StringUtils.isEmpty(str);
- }
-
- /**
- *
- * StringUtils.isBlank(null) = true
- * StringUtils.isBlank("null") = true
- * StringUtils.isBlank("") = true
- * StringUtils.isBlank(" ") = true
- * StringUtils.isBlank("bob") = false
- * StringUtils.isBlank(" bob ") = false
- *
- *
- * @param str the String to check, may be null
- * @return true if the String is null, empty or whitespace
- * @since 2.0
- */
- public static boolean isBlank(String str) {
- int strLen;
- if (str == null || (strLen = str.length()) == 0) {
- return true;
- }
- if(equals("null", str.trim().toLowerCase())){
- return true;
- }
- for (int i = 0; i < strLen; i++) {
- if ((Character.isWhitespace(str.charAt(i)) == false)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- *
- * StringUtils.isNotBlank(null) = false
- * StringUtils.isNotBlank("null") = false
- * StringUtils.isNotBlank("") = false
- * StringUtils.isNotBlank(" ") = false
- * StringUtils.isNotBlank("bob") = true
- * StringUtils.isNotBlank(" bob ") = true
- *
- *
- * @param str the String to check, may be null
- * @return true if the String is
- * not empty and not null and not whitespace
- * @since 2.0
- */
- public static boolean isNotBlank(String str) {
- return !StringUtils.isBlank(str);
- }
-
- // Trim
- //-----------------------------------------------------------------------
- /**
- * null by returning
- * an empty String ("").
- * StringUtils.clean(null) = ""
- * StringUtils.clean("") = ""
- * StringUtils.clean("abc") = "abc"
- * StringUtils.clean(" abc ") = "abc"
- * StringUtils.clean(" ") = ""
- *
- *
- * @see String#trim()
- * @param str the String to clean, may be null
- * @return the trimmed text, never null
- * @deprecated Use the clearer named {@link #trimToEmpty(String)}.
- * Method will be removed in Commons Lang 3.0.
- */
- public static String clean(String str) {
- return str == null ? EMPTY : str.trim();
- }
-
- /**
- * null by returning
- * null.
- * StringUtils.trim(null) = null
- * StringUtils.trim("") = ""
- * StringUtils.trim(" ") = ""
- * StringUtils.trim("abc") = "abc"
- * StringUtils.trim(" abc ") = "abc"
- *
- *
- * @param str the String to be trimmed, may be null
- * @return the trimmed string, null if null String input
- */
- public static String trim(String str) {
- return str == null ? null : str.trim();
- }
-
- /**
- * null if the String is
- * empty ("") after the trim or if it is null.
- *
- *
- * StringUtils.trimToNull(null) = null
- * StringUtils.trimToNull("") = null
- * StringUtils.trimToNull(" ") = null
- * StringUtils.trimToNull("abc") = "abc"
- * StringUtils.trimToNull(" abc ") = "abc"
- *
- *
- * @param str the String to be trimmed, may be null
- * @return the trimmed String,
- * null if only chars <= 32, empty or null String input
- * @since 2.0
- */
- public static String trimToNull(String str) {
- String ts = trim(str);
- return isEmpty(ts) ? null : ts;
- }
-
- /**
- * null.
- *
- *
- * StringUtils.trimToEmpty(null) = ""
- * StringUtils.trimToEmpty("") = ""
- * StringUtils.trimToEmpty(" ") = ""
- * StringUtils.trimToEmpty("abc") = "abc"
- * StringUtils.trimToEmpty(" abc ") = "abc"
- *
- *
- * @param str the String to be trimmed, may be null
- * @return the trimmed String, or an empty String if null input
- * @since 2.0
- */
- public static String trimToEmpty(String str) {
- return str == null ? EMPTY : str.trim();
- }
-
- // Stripping
- //-----------------------------------------------------------------------
- /**
- * null input String returns null.
- * StringUtils.strip(null) = null
- * StringUtils.strip("") = ""
- * StringUtils.strip(" ") = ""
- * StringUtils.strip("abc") = "abc"
- * StringUtils.strip(" abc") = "abc"
- * StringUtils.strip("abc ") = "abc"
- * StringUtils.strip(" abc ") = "abc"
- * StringUtils.strip(" ab c ") = "ab c"
- *
- *
- * @param str the String to remove whitespace from, may be null
- * @return the stripped String, null if null String input
- */
- public static String strip(String str) {
- return strip(str, null);
- }
-
- /**
- * null if the String is empty ("") after the strip.
- * StringUtils.stripToNull(null) = null
- * StringUtils.stripToNull("") = null
- * StringUtils.stripToNull(" ") = null
- * StringUtils.stripToNull("abc") = "abc"
- * StringUtils.stripToNull(" abc") = "abc"
- * StringUtils.stripToNull("abc ") = "abc"
- * StringUtils.stripToNull(" abc ") = "abc"
- * StringUtils.stripToNull(" ab c ") = "ab c"
- *
- *
- * @param str the String to be stripped, may be null
- * @return the stripped String,
- * null if whitespace, empty or null String input
- * @since 2.0
- */
- public static String stripToNull(String str) {
- if (str == null) {
- return null;
- }
- str = strip(str, null);
- return str.length() == 0 ? null : str;
- }
-
- /**
- * null input.
- * StringUtils.stripToEmpty(null) = ""
- * StringUtils.stripToEmpty("") = ""
- * StringUtils.stripToEmpty(" ") = ""
- * StringUtils.stripToEmpty("abc") = "abc"
- * StringUtils.stripToEmpty(" abc") = "abc"
- * StringUtils.stripToEmpty("abc ") = "abc"
- * StringUtils.stripToEmpty(" abc ") = "abc"
- * StringUtils.stripToEmpty(" ab c ") = "ab c"
- *
- *
- * @param str the String to be stripped, may be null
- * @return the trimmed String, or an empty String if null input
- * @since 2.0
- */
- public static String stripToEmpty(String str) {
- return str == null ? EMPTY : strip(str, null);
- }
-
- /**
- * null input String returns null.
- * An empty string ("") input returns the empty string.null, whitespace is
- * stripped as defined by {@link Character#isWhitespace(char)}.
- * Alternatively use {@link #strip(String)}.
- * StringUtils.strip(null, *) = null
- * StringUtils.strip("", *) = ""
- * StringUtils.strip("abc", null) = "abc"
- * StringUtils.strip(" abc", null) = "abc"
- * StringUtils.strip("abc ", null) = "abc"
- * StringUtils.strip(" abc ", null) = "abc"
- * StringUtils.strip(" abcyx", "xyz") = " abc"
- *
- *
- * @param str the String to remove characters from, may be null
- * @param stripChars the characters to remove, null treated as whitespace
- * @return the stripped String, null if null String input
- */
- public static String strip(String str, String stripChars) {
- if (isEmpty(str)) {
- return str;
- }
- str = stripStart(str, stripChars);
- return stripEnd(str, stripChars);
- }
-
- /**
- * null input String returns null.
- * An empty string ("") input returns the empty string.null, whitespace is
- * stripped as defined by {@link Character#isWhitespace(char)}.
- * StringUtils.stripStart(null, *) = null
- * StringUtils.stripStart("", *) = ""
- * StringUtils.stripStart("abc", "") = "abc"
- * StringUtils.stripStart("abc", null) = "abc"
- * StringUtils.stripStart(" abc", null) = "abc"
- * StringUtils.stripStart("abc ", null) = "abc "
- * StringUtils.stripStart(" abc ", null) = "abc "
- * StringUtils.stripStart("yxabc ", "xyz") = "abc "
- *
- *
- * @param str the String to remove characters from, may be null
- * @param stripChars the characters to remove, null treated as whitespace
- * @return the stripped String, null if null String input
- */
- public static String stripStart(String str, String stripChars) {
- int strLen;
- if (str == null || (strLen = str.length()) == 0) {
- return str;
- }
- int start = 0;
- if (stripChars == null) {
- while ((start != strLen) && Character.isWhitespace(str.charAt(start))) {
- start++;
- }
- } else if (stripChars.length() == 0) {
- return str;
- } else {
- while ((start != strLen) && (stripChars.indexOf(str.charAt(start)) != INDEX_NOT_FOUND)) {
- start++;
- }
- }
- return str.substring(start);
- }
-
- /**
- * null input String returns null.
- * An empty string ("") input returns the empty string.null, whitespace is
- * stripped as defined by {@link Character#isWhitespace(char)}.
- * StringUtils.stripEnd(null, *) = null
- * StringUtils.stripEnd("", *) = ""
- * StringUtils.stripEnd("abc", "") = "abc"
- * StringUtils.stripEnd("abc", null) = "abc"
- * StringUtils.stripEnd(" abc", null) = " abc"
- * StringUtils.stripEnd("abc ", null) = "abc"
- * StringUtils.stripEnd(" abc ", null) = " abc"
- * StringUtils.stripEnd(" abcyx", "xyz") = " abc"
- * StringUtils.stripEnd("120.00", ".0") = "12"
- *
- *
- * @param str the String to remove characters from, may be null
- * @param stripChars the set of characters to remove, null treated as whitespace
- * @return the stripped String, null if null String input
- */
- public static String stripEnd(String str, String stripChars) {
- int end;
- if (str == null || (end = str.length()) == 0) {
- return str;
- }
-
- if (stripChars == null) {
- while ((end != 0) && Character.isWhitespace(str.charAt(end - 1))) {
- end--;
- }
- } else if (stripChars.length() == 0) {
- return str;
- } else {
- while ((end != 0) && (stripChars.indexOf(str.charAt(end - 1)) != INDEX_NOT_FOUND)) {
- end--;
- }
- }
- return str.substring(0, end);
- }
-
- // StripAll
- //-----------------------------------------------------------------------
- /**
- * null array will return null.
- * An empty array will return itself.
- * A null array entry will be ignored.
- * StringUtils.stripAll(null) = null
- * StringUtils.stripAll([]) = []
- * StringUtils.stripAll(["abc", " abc"]) = ["abc", "abc"]
- * StringUtils.stripAll(["abc ", null]) = ["abc", null]
- *
- *
- * @param strs the array to remove whitespace from, may be null
- * @return the stripped Strings, null if null array input
- */
- public static String[] stripAll(String[] strs) {
- return stripAll(strs, null);
- }
-
- /**
- * null array will return null.
- * An empty array will return itself.
- * A null array entry will be ignored.
- * A null stripChars will strip whitespace as defined by
- * {@link Character#isWhitespace(char)}.
- * StringUtils.stripAll(null, *) = null
- * StringUtils.stripAll([], *) = []
- * StringUtils.stripAll(["abc", " abc"], null) = ["abc", "abc"]
- * StringUtils.stripAll(["abc ", null], null) = ["abc", null]
- * StringUtils.stripAll(["abc ", null], "yz") = ["abc ", null]
- * StringUtils.stripAll(["yabcz", null], "yz") = ["abc", null]
- *
- *
- * @param strs the array to remove characters from, may be null
- * @param stripChars the characters to remove, null treated as whitespace
- * @return the stripped Strings, null if null array input
- */
- public static String[] stripAll(String[] strs, String stripChars) {
- int strsLen;
- if (strs == null || (strsLen = strs.length) == 0) {
- return strs;
- }
- String[] newArr = new String[strsLen];
- for (int i = 0; i < strsLen; i++) {
- newArr[i] = strip(strs[i], stripChars);
- }
- return newArr;
- }
-
- // Equals
- //-----------------------------------------------------------------------
- /**
- * true if they are equal.nulls are handled without exceptions. Two null
- * references are considered to be equal. The comparison is case sensitive.
- * StringUtils.equals(null, null) = true
- * StringUtils.equals(null, "abc") = false
- * StringUtils.equals("abc", null) = false
- * StringUtils.equals("abc", "abc") = true
- * StringUtils.equals("abc", "ABC") = false
- *
- *
- * @see String#equals(Object)
- * @param str1 the first String, may be null
- * @param str2 the second String, may be null
- * @return true if the Strings are equal, case sensitive, or
- * both null
- */
- public static boolean equals(String str1, String str2) {
- return str1 == null ? str2 == null : str1.equals(str2);
- }
-
- /**
- * true if they are equal ignoring
- * the case.nulls are handled without exceptions. Two null
- * references are considered equal. Comparison is case insensitive.
- * StringUtils.equalsIgnoreCase(null, null) = true
- * StringUtils.equalsIgnoreCase(null, "abc") = false
- * StringUtils.equalsIgnoreCase("abc", null) = false
- * StringUtils.equalsIgnoreCase("abc", "abc") = true
- * StringUtils.equalsIgnoreCase("abc", "ABC") = true
- *
- *
- * @see String#equalsIgnoreCase(String)
- * @param str1 the first String, may be null
- * @param str2 the second String, may be null
- * @return true if the Strings are equal, case insensitive, or
- * both null
- */
- public static boolean equalsIgnoreCase(String str1, String str2) {
- return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2);
- }
-
- // IndexOf
- //-----------------------------------------------------------------------
- /**
- * null.
- * This method uses {@link String#indexOf(int)}.null or empty ("") String will return INDEX_NOT_FOUND (-1).
- * StringUtils.indexOf(null, *) = -1
- * StringUtils.indexOf("", *) = -1
- * StringUtils.indexOf("aabaabaa", 'a') = 0
- * StringUtils.indexOf("aabaabaa", 'b') = 2
- *
- *
- * @param str the String to check, may be null
- * @param searchChar the character to find
- * @return the first index of the search character,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int indexOf(String str, char searchChar) {
- if (isEmpty(str)) {
- return INDEX_NOT_FOUND;
- }
- return str.indexOf(searchChar);
- }
-
- /**
- * null.
- * This method uses {@link String#indexOf(int, int)}.null or empty ("") String will return (INDEX_NOT_FOUND) -1.
- * A negative start position is treated as zero.
- * A start position greater than the string length returns -1.
- * StringUtils.indexOf(null, *, *) = -1
- * StringUtils.indexOf("", *, *) = -1
- * StringUtils.indexOf("aabaabaa", 'b', 0) = 2
- * StringUtils.indexOf("aabaabaa", 'b', 3) = 5
- * StringUtils.indexOf("aabaabaa", 'b', 9) = -1
- * StringUtils.indexOf("aabaabaa", 'b', -1) = 2
- *
- *
- * @param str the String to check, may be null
- * @param searchChar the character to find
- * @param startPos the start position, negative treated as zero
- * @return the first index of the search character,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int indexOf(String str, char searchChar, int startPos) {
- if (isEmpty(str)) {
- return INDEX_NOT_FOUND;
- }
- return str.indexOf(searchChar, startPos);
- }
-
- /**
- * null.
- * This method uses {@link String#indexOf(String)}.null String will return -1.
- * StringUtils.indexOf(null, *) = -1
- * StringUtils.indexOf(*, null) = -1
- * StringUtils.indexOf("", "") = 0
- * StringUtils.indexOf("", *) = -1 (except when * = "")
- * StringUtils.indexOf("aabaabaa", "a") = 0
- * StringUtils.indexOf("aabaabaa", "b") = 2
- * StringUtils.indexOf("aabaabaa", "ab") = 1
- * StringUtils.indexOf("aabaabaa", "") = 0
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int indexOf(String str, String searchStr) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- return str.indexOf(searchStr);
- }
-
- /**
- * null.
- * This method uses {@link String#indexOf(String)}.null String will return -1.
- * StringUtils.ordinalIndexOf(null, *, *) = -1
- * StringUtils.ordinalIndexOf(*, null, *) = -1
- * StringUtils.ordinalIndexOf("", "", *) = 0
- * StringUtils.ordinalIndexOf("aabaabaa", "a", 1) = 0
- * StringUtils.ordinalIndexOf("aabaabaa", "a", 2) = 1
- * StringUtils.ordinalIndexOf("aabaabaa", "b", 1) = 2
- * StringUtils.ordinalIndexOf("aabaabaa", "b", 2) = 5
- * StringUtils.ordinalIndexOf("aabaabaa", "ab", 1) = 1
- * StringUtils.ordinalIndexOf("aabaabaa", "ab", 2) = 4
- * StringUtils.ordinalIndexOf("aabaabaa", "", 1) = 0
- * StringUtils.ordinalIndexOf("aabaabaa", "", 2) = 0
- *
- *
- *
- * str.substring(0, lastOrdinalIndexOf(str, "\n", n))
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @param ordinal the n-th searchStr to find
- * @return the n-th index of the search String,
- * -1 (INDEX_NOT_FOUND) if no match or null string input
- * @since 2.1
- */
- public static int ordinalIndexOf(String str, String searchStr, int ordinal) {
- return ordinalIndexOf(str, searchStr, ordinal, false);
- }
-
- /**
- * null.
- * This method uses {@link String#indexOf(String)}.null String will return -1.searchStr to find
- * @param lastIndex true if lastOrdinalIndexOf() otherwise false if ordinalIndexOf()
- * @return the n-th index of the search String,
- * -1 (INDEX_NOT_FOUND) if no match or null string input
- */
- // Shared code between ordinalIndexOf(String,String,int) and lastOrdinalIndexOf(String,String,int)
- private static int ordinalIndexOf(String str, String searchStr, int ordinal, boolean lastIndex) {
- if (str == null || searchStr == null || ordinal <= 0) {
- return INDEX_NOT_FOUND;
- }
- if (searchStr.length() == 0) {
- return lastIndex ? str.length() : 0;
- }
- int found = 0;
- int index = lastIndex ? str.length() : INDEX_NOT_FOUND;
- do {
- if(lastIndex) {
- index = str.lastIndexOf(searchStr, index - 1);
- } else {
- index = str.indexOf(searchStr, index + 1);
- }
- if (index < 0) {
- return index;
- }
- found++;
- } while (found < ordinal);
- return index;
- }
-
- /**
- * null.
- * This method uses {@link String#indexOf(String, int)}.null String will return -1.
- * A negative start position is treated as zero.
- * An empty ("") search String always matches.
- * A start position greater than the string length only matches
- * an empty search String.
- * StringUtils.indexOf(null, *, *) = -1
- * StringUtils.indexOf(*, null, *) = -1
- * StringUtils.indexOf("", "", 0) = 0
- * StringUtils.indexOf("", *, 0) = -1 (except when * = "")
- * StringUtils.indexOf("aabaabaa", "a", 0) = 0
- * StringUtils.indexOf("aabaabaa", "b", 0) = 2
- * StringUtils.indexOf("aabaabaa", "ab", 0) = 1
- * StringUtils.indexOf("aabaabaa", "b", 3) = 5
- * StringUtils.indexOf("aabaabaa", "b", 9) = -1
- * StringUtils.indexOf("aabaabaa", "b", -1) = 2
- * StringUtils.indexOf("aabaabaa", "", 2) = 2
- * StringUtils.indexOf("abc", "", 9) = 3
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @param startPos the start position, negative treated as zero
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int indexOf(String str, String searchStr, int startPos) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- // JDK1.2/JDK1.3 have a bug, when startPos > str.length for "", hence
- if (searchStr.length() == 0 && startPos >= str.length()) {
- return str.length();
- }
- return str.indexOf(searchStr, startPos);
- }
-
- /**
- * null String will return -1.
- * A negative start position is treated as zero.
- * An empty ("") search String always matches.
- * A start position greater than the string length only matches
- * an empty search String.
- * StringUtils.indexOfIgnoreCase(null, *) = -1
- * StringUtils.indexOfIgnoreCase(*, null) = -1
- * StringUtils.indexOfIgnoreCase("", "") = 0
- * StringUtils.indexOfIgnoreCase("aabaabaa", "a") = 0
- * StringUtils.indexOfIgnoreCase("aabaabaa", "b") = 2
- * StringUtils.indexOfIgnoreCase("aabaabaa", "ab") = 1
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.5
- */
- public static int indexOfIgnoreCase(String str, String searchStr) {
- return indexOfIgnoreCase(str, searchStr, 0);
- }
-
- /**
- * null String will return -1.
- * A negative start position is treated as zero.
- * An empty ("") search String always matches.
- * A start position greater than the string length only matches
- * an empty search String.
- * StringUtils.indexOfIgnoreCase(null, *, *) = -1
- * StringUtils.indexOfIgnoreCase(*, null, *) = -1
- * StringUtils.indexOfIgnoreCase("", "", 0) = 0
- * StringUtils.indexOfIgnoreCase("aabaabaa", "A", 0) = 0
- * StringUtils.indexOfIgnoreCase("aabaabaa", "B", 0) = 2
- * StringUtils.indexOfIgnoreCase("aabaabaa", "AB", 0) = 1
- * StringUtils.indexOfIgnoreCase("aabaabaa", "B", 3) = 5
- * StringUtils.indexOfIgnoreCase("aabaabaa", "B", 9) = -1
- * StringUtils.indexOfIgnoreCase("aabaabaa", "B", -1) = 2
- * StringUtils.indexOfIgnoreCase("aabaabaa", "", 2) = 2
- * StringUtils.indexOfIgnoreCase("abc", "", 9) = 3
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @param startPos the start position, negative treated as zero
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.5
- */
- public static int indexOfIgnoreCase(String str, String searchStr, int startPos) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- if (startPos < 0) {
- startPos = 0;
- }
- int endLimit = (str.length() - searchStr.length()) + 1;
- if (startPos > endLimit) {
- return INDEX_NOT_FOUND;
- }
- if (searchStr.length() == 0) {
- return startPos;
- }
- for (int i = startPos; i < endLimit; i++) {
- if (str.regionMatches(true, i, searchStr, 0, searchStr.length())) {
- return i;
- }
- }
- return INDEX_NOT_FOUND;
- }
-
- // LastIndexOf
- //-----------------------------------------------------------------------
- /**
- * null.
- * This method uses {@link String#lastIndexOf(int)}.null or empty ("") String will return -1.
- * StringUtils.lastIndexOf(null, *) = -1
- * StringUtils.lastIndexOf("", *) = -1
- * StringUtils.lastIndexOf("aabaabaa", 'a') = 7
- * StringUtils.lastIndexOf("aabaabaa", 'b') = 5
- *
- *
- * @param str the String to check, may be null
- * @param searchChar the character to find
- * @return the last index of the search character,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int lastIndexOf(String str, char searchChar) {
- if (isEmpty(str)) {
- return INDEX_NOT_FOUND;
- }
- return str.lastIndexOf(searchChar);
- }
-
- /**
- * null.
- * This method uses {@link String#lastIndexOf(int, int)}.null or empty ("") String will return -1.
- * A negative start position returns -1.
- * A start position greater than the string length searches the whole string.
- * StringUtils.lastIndexOf(null, *, *) = -1
- * StringUtils.lastIndexOf("", *, *) = -1
- * StringUtils.lastIndexOf("aabaabaa", 'b', 8) = 5
- * StringUtils.lastIndexOf("aabaabaa", 'b', 4) = 2
- * StringUtils.lastIndexOf("aabaabaa", 'b', 0) = -1
- * StringUtils.lastIndexOf("aabaabaa", 'b', 9) = 5
- * StringUtils.lastIndexOf("aabaabaa", 'b', -1) = -1
- * StringUtils.lastIndexOf("aabaabaa", 'a', 0) = 0
- *
- *
- * @param str the String to check, may be null
- * @param searchChar the character to find
- * @param startPos the start position
- * @return the last index of the search character,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int lastIndexOf(String str, char searchChar, int startPos) {
- if (isEmpty(str)) {
- return INDEX_NOT_FOUND;
- }
- return str.lastIndexOf(searchChar, startPos);
- }
-
- /**
- * null.
- * This method uses {@link String#lastIndexOf(String)}.null String will return -1.
- * StringUtils.lastIndexOf(null, *) = -1
- * StringUtils.lastIndexOf(*, null) = -1
- * StringUtils.lastIndexOf("", "") = 0
- * StringUtils.lastIndexOf("aabaabaa", "a") = 7
- * StringUtils.lastIndexOf("aabaabaa", "b") = 5
- * StringUtils.lastIndexOf("aabaabaa", "ab") = 4
- * StringUtils.lastIndexOf("aabaabaa", "") = 8
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @return the last index of the search String,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int lastIndexOf(String str, String searchStr) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- return str.lastIndexOf(searchStr);
- }
-
- /**
- * null.
- * This method uses {@link String#lastIndexOf(String)}.null String will return -1.
- * StringUtils.lastOrdinalIndexOf(null, *, *) = -1
- * StringUtils.lastOrdinalIndexOf(*, null, *) = -1
- * StringUtils.lastOrdinalIndexOf("", "", *) = 0
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "a", 1) = 7
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "a", 2) = 6
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "b", 1) = 5
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "b", 2) = 2
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "ab", 1) = 4
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "ab", 2) = 1
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "", 1) = 8
- * StringUtils.lastOrdinalIndexOf("aabaabaa", "", 2) = 8
- *
- *
- *
- * str.substring(lastOrdinalIndexOf(str, "\n", n) + 1)
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @param ordinal the n-th last searchStr to find
- * @return the n-th last index of the search String,
- * -1 (INDEX_NOT_FOUND) if no match or null string input
- * @since 2.5
- */
- public static int lastOrdinalIndexOf(String str, String searchStr, int ordinal) {
- return ordinalIndexOf(str, searchStr, ordinal, true);
- }
-
- /**
- * null.
- * This method uses {@link String#lastIndexOf(String, int)}.null String will return -1.
- * A negative start position returns -1.
- * An empty ("") search String always matches unless the start position is negative.
- * A start position greater than the string length searches the whole string.
- * StringUtils.lastIndexOf(null, *, *) = -1
- * StringUtils.lastIndexOf(*, null, *) = -1
- * StringUtils.lastIndexOf("aabaabaa", "a", 8) = 7
- * StringUtils.lastIndexOf("aabaabaa", "b", 8) = 5
- * StringUtils.lastIndexOf("aabaabaa", "ab", 8) = 4
- * StringUtils.lastIndexOf("aabaabaa", "b", 9) = 5
- * StringUtils.lastIndexOf("aabaabaa", "b", -1) = -1
- * StringUtils.lastIndexOf("aabaabaa", "a", 0) = 0
- * StringUtils.lastIndexOf("aabaabaa", "b", 0) = -1
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @param startPos the start position, negative treated as zero
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.0
- */
- public static int lastIndexOf(String str, String searchStr, int startPos) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- return str.lastIndexOf(searchStr, startPos);
- }
-
- /**
- * null String will return -1.
- * A negative start position returns -1.
- * An empty ("") search String always matches unless the start position is negative.
- * A start position greater than the string length searches the whole string.
- * StringUtils.lastIndexOfIgnoreCase(null, *) = -1
- * StringUtils.lastIndexOfIgnoreCase(*, null) = -1
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A") = 7
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B") = 5
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "AB") = 4
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.5
- */
- public static int lastIndexOfIgnoreCase(String str, String searchStr) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- return lastIndexOfIgnoreCase(str, searchStr, str.length());
- }
-
- /**
- * null String will return -1.
- * A negative start position returns -1.
- * An empty ("") search String always matches unless the start position is negative.
- * A start position greater than the string length searches the whole string.
- * StringUtils.lastIndexOfIgnoreCase(null, *, *) = -1
- * StringUtils.lastIndexOfIgnoreCase(*, null, *) = -1
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A", 8) = 7
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 8) = 5
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "AB", 8) = 4
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 9) = 5
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", -1) = -1
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "A", 0) = 0
- * StringUtils.lastIndexOfIgnoreCase("aabaabaa", "B", 0) = -1
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @param startPos the start position
- * @return the first index of the search String,
- * -1 if no match or null string input
- * @since 2.5
- */
- public static int lastIndexOfIgnoreCase(String str, String searchStr, int startPos) {
- if (str == null || searchStr == null) {
- return INDEX_NOT_FOUND;
- }
- if (startPos > (str.length() - searchStr.length())) {
- startPos = str.length() - searchStr.length();
- }
- if (startPos < 0) {
- return INDEX_NOT_FOUND;
- }
- if (searchStr.length() == 0) {
- return startPos;
- }
-
- for (int i = startPos; i >= 0; i--) {
- if (str.regionMatches(true, i, searchStr, 0, searchStr.length())) {
- return i;
- }
- }
- return INDEX_NOT_FOUND;
- }
-
- // Contains
- //-----------------------------------------------------------------------
- /**
- * null.
- * This method uses {@link String#indexOf(int)}.null or empty ("") String will return false.
- * StringUtils.contains(null, *) = false
- * StringUtils.contains("", *) = false
- * StringUtils.contains("abc", 'a') = true
- * StringUtils.contains("abc", 'z') = false
- *
- *
- * @param str the String to check, may be null
- * @param searchChar the character to find
- * @return true if the String contains the search character,
- * false if not or null string input
- * @since 2.0
- */
- public static boolean contains(String str, char searchChar) {
- if (isEmpty(str)) {
- return false;
- }
- return str.indexOf(searchChar) >= 0;
- }
-
- /**
- * null.
- * This method uses {@link String#indexOf(String)}.null String will return false.
- * StringUtils.contains(null, *) = false
- * StringUtils.contains(*, null) = false
- * StringUtils.contains("", "") = true
- * StringUtils.contains("abc", "") = true
- * StringUtils.contains("abc", "a") = true
- * StringUtils.contains("abc", "z") = false
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @return true if the String contains the search String,
- * false if not or null string input
- * @since 2.0
- */
- public static boolean contains(String str, String searchStr) {
- if (str == null || searchStr == null) {
- return false;
- }
- return str.indexOf(searchStr) >= 0;
- }
-
- /**
- * null. Case-insensitivity is defined as by
- * {@link String#equalsIgnoreCase(String)}.
- *
- * null String will return false.
- * StringUtils.contains(null, *) = false
- * StringUtils.contains(*, null) = false
- * StringUtils.contains("", "") = true
- * StringUtils.contains("abc", "") = true
- * StringUtils.contains("abc", "a") = true
- * StringUtils.contains("abc", "z") = false
- * StringUtils.contains("abc", "A") = true
- * StringUtils.contains("abc", "Z") = false
- *
- *
- * @param str the String to check, may be null
- * @param searchStr the String to find, may be null
- * @return true if the String contains the search String irrespective of
- * case or false if not or null string input
- */
- public static boolean containsIgnoreCase(String str, String searchStr) {
- if (str == null || searchStr == null) {
- return false;
- }
- int len = searchStr.length();
- int max = str.length() - len;
- for (int i = 0; i <= max; i++) {
- if (str.regionMatches(true, i, searchStr, 0, len)) {
- return true;
- }
- }
- return false;
- }
-
-
- // IndexOfAny strings
- //-----------------------------------------------------------------------
- /**
- * null String will return -1.
- * A null or zero length search array will return -1.
- * A null search array entry will be ignored, but a search
- * array containing "" will return 0 if str is not
- * null. This method uses {@link String#indexOf(String)}.
- * StringUtils.indexOfAny(null, *) = -1
- * StringUtils.indexOfAny(*, null) = -1
- * StringUtils.indexOfAny(*, []) = -1
- * StringUtils.indexOfAny("zzabyycdxx", ["ab","cd"]) = 2
- * StringUtils.indexOfAny("zzabyycdxx", ["cd","ab"]) = 2
- * StringUtils.indexOfAny("zzabyycdxx", ["mn","op"]) = -1
- * StringUtils.indexOfAny("zzabyycdxx", ["zab","aby"]) = 1
- * StringUtils.indexOfAny("zzabyycdxx", [""]) = 0
- * StringUtils.indexOfAny("", [""]) = 0
- * StringUtils.indexOfAny("", ["a"]) = -1
- *
- *
- * @param str the String to check, may be null
- * @param searchStrs the Strings to search for, may be null
- * @return the first index of any of the searchStrs in str, -1 if no match
- */
- public static int indexOfAny(String str, String[] searchStrs) {
- if ((str == null) || (searchStrs == null)) {
- return INDEX_NOT_FOUND;
- }
- int sz = searchStrs.length;
-
- // String's can't have a MAX_VALUEth index.
- int ret = Integer.MAX_VALUE;
-
- int tmp = 0;
- for (int i = 0; i < sz; i++) {
- String search = searchStrs[i];
- if (search == null) {
- continue;
- }
- tmp = str.indexOf(search);
- if (tmp == INDEX_NOT_FOUND) {
- continue;
- }
-
- if (tmp < ret) {
- ret = tmp;
- }
- }
-
- return (ret == Integer.MAX_VALUE) ? INDEX_NOT_FOUND : ret;
- }
-
- /**
- * null String will return -1.
- * A null search array will return -1.
- * A null or zero length search array entry will be ignored,
- * but a search array containing "" will return the length of str
- * if str is not null. This method uses {@link String#indexOf(String)}
- * StringUtils.lastIndexOfAny(null, *) = -1
- * StringUtils.lastIndexOfAny(*, null) = -1
- * StringUtils.lastIndexOfAny(*, []) = -1
- * StringUtils.lastIndexOfAny(*, [null]) = -1
- * StringUtils.lastIndexOfAny("zzabyycdxx", ["ab","cd"]) = 6
- * StringUtils.lastIndexOfAny("zzabyycdxx", ["cd","ab"]) = 6
- * StringUtils.lastIndexOfAny("zzabyycdxx", ["mn","op"]) = -1
- * StringUtils.lastIndexOfAny("zzabyycdxx", ["mn","op"]) = -1
- * StringUtils.lastIndexOfAny("zzabyycdxx", ["mn",""]) = 10
- *
- *
- * @param str the String to check, may be null
- * @param searchStrs the Strings to search for, may be null
- * @return the last index of any of the Strings, -1 if no match
- */
- public static int lastIndexOfAny(String str, String[] searchStrs) {
- if ((str == null) || (searchStrs == null)) {
- return INDEX_NOT_FOUND;
- }
- int sz = searchStrs.length;
- int ret = INDEX_NOT_FOUND;
- int tmp = 0;
- for (int i = 0; i < sz; i++) {
- String search = searchStrs[i];
- if (search == null) {
- continue;
- }
- tmp = str.lastIndexOf(search);
- if (tmp > ret) {
- ret = tmp;
- }
- }
- return ret;
- }
-
- // Substring
- //-----------------------------------------------------------------------
- /**
- * n
- * characters from the end of the String.null String will return null.
- * An empty ("") String will return "".
- * StringUtils.substring(null, *) = null
- * StringUtils.substring("", *) = ""
- * StringUtils.substring("abc", 0) = "abc"
- * StringUtils.substring("abc", 2) = "c"
- * StringUtils.substring("abc", 4) = ""
- * StringUtils.substring("abc", -2) = "bc"
- * StringUtils.substring("abc", -4) = "abc"
- *
- *
- * @param str the String to get the substring from, may be null
- * @param start the position to start from, negative means
- * count back from the end of the String by this many characters
- * @return substring from start position, null if null String input
- */
- public static String substring(String str, int start) {
- if (str == null) {
- return null;
- }
-
- // handle negatives, which means last n characters
- if (start < 0) {
- start = str.length() + start; // remember start is negative
- }
-
- if (start < 0) {
- start = 0;
- }
- if (start > str.length()) {
- return EMPTY;
- }
-
- return str.substring(start);
- }
-
- /**
- * n
- * characters from the end of the String.start
- * position and ends before the end position. All position counting is
- * zero-based -- i.e., to start at the beginning of the string use
- * start = 0. Negative start and end positions can be used to
- * specify offsets relative to the end of the String.start is not strictly to the left of end, ""
- * is returned.
- * StringUtils.substring(null, *, *) = null
- * StringUtils.substring("", * , *) = "";
- * StringUtils.substring("abc", 0, 2) = "ab"
- * StringUtils.substring("abc", 2, 0) = ""
- * StringUtils.substring("abc", 2, 4) = "c"
- * StringUtils.substring("abc", 4, 6) = ""
- * StringUtils.substring("abc", 2, 2) = ""
- * StringUtils.substring("abc", -2, -1) = "b"
- * StringUtils.substring("abc", -4, 2) = "ab"
- *
- *
- * @param str the String to get the substring from, may be null
- * @param start the position to start from, negative means
- * count back from the end of the String by this many characters
- * @param end the position to end at (exclusive), negative means
- * count back from the end of the String by this many characters
- * @return substring from start position to end positon,
- * null if null String input
- */
- public static String substring(String str, int start, int end) {
- if (str == null) {
- return null;
- }
-
- // handle negatives
- if (end < 0) {
- end = str.length() + end; // remember end is negative
- }
- if (start < 0) {
- start = str.length() + start; // remember start is negative
- }
-
- // check length next
- if (end > str.length()) {
- end = str.length();
- }
-
- // if start is greater than end, return ""
- if (start > end) {
- return EMPTY;
- }
-
- if (start < 0) {
- start = 0;
- }
- if (end < 0) {
- end = 0;
- }
-
- return str.substring(start, end);
- }
-
- // Left/Right/Mid
- //-----------------------------------------------------------------------
- /**
- * len characters of a String.len characters are not available, or the
- * String is null, the String will be returned without
- * an exception. An empty String is returned if len is negative.
- * StringUtils.left(null, *) = null
- * StringUtils.left(*, -ve) = ""
- * StringUtils.left("", *) = ""
- * StringUtils.left("abc", 0) = ""
- * StringUtils.left("abc", 2) = "ab"
- * StringUtils.left("abc", 4) = "abc"
- *
- *
- * @param str the String to get the leftmost characters from, may be null
- * @param len the length of the required String
- * @return the leftmost characters, null if null String input
- */
- public static String left(String str, int len) {
- if (str == null) {
- return null;
- }
- if (len < 0) {
- return EMPTY;
- }
- if (str.length() <= len) {
- return str;
- }
- return str.substring(0, len);
- }
-
- /**
- * len characters of a String.len characters are not available, or the String
- * is null, the String will be returned without an
- * an exception. An empty String is returned if len is negative.
- * StringUtils.right(null, *) = null
- * StringUtils.right(*, -ve) = ""
- * StringUtils.right("", *) = ""
- * StringUtils.right("abc", 0) = ""
- * StringUtils.right("abc", 2) = "bc"
- * StringUtils.right("abc", 4) = "abc"
- *
- *
- * @param str the String to get the rightmost characters from, may be null
- * @param len the length of the required String
- * @return the rightmost characters, null if null String input
- */
- public static String right(String str, int len) {
- if (str == null) {
- return null;
- }
- if (len < 0) {
- return EMPTY;
- }
- if (str.length() <= len) {
- return str;
- }
- return str.substring(str.length() - len);
- }
-
- /**
- * len characters from the middle of a String.len characters are not available, the remainder
- * of the String will be returned without an exception. If the
- * String is null, null will be returned.
- * An empty String is returned if len is negative or exceeds the
- * length of str.
- * StringUtils.mid(null, *, *) = null
- * StringUtils.mid(*, *, -ve) = ""
- * StringUtils.mid("", 0, *) = ""
- * StringUtils.mid("abc", 0, 2) = "ab"
- * StringUtils.mid("abc", 0, 4) = "abc"
- * StringUtils.mid("abc", 2, 4) = "c"
- * StringUtils.mid("abc", 4, 2) = ""
- * StringUtils.mid("abc", -2, 2) = "ab"
- *
- *
- * @param str the String to get the characters from, may be null
- * @param pos the position to start from, negative treated as zero
- * @param len the length of the required String
- * @return the middle characters, null if null String input
- */
- public static String mid(String str, int pos, int len) {
- if (str == null) {
- return null;
- }
- if (len < 0 || pos > str.length()) {
- return EMPTY;
- }
- if (pos < 0) {
- pos = 0;
- }
- if (str.length() <= (pos + len)) {
- return str.substring(pos);
- }
- return str.substring(pos, pos + len);
- }
-
- // SubStringAfter/SubStringBefore
- //-----------------------------------------------------------------------
- /**
- * null string input will return null.
- * An empty ("") string input will return the empty string.
- * A null separator will return the input string.
- * StringUtils.substringBefore(null, *) = null
- * StringUtils.substringBefore("", *) = ""
- * StringUtils.substringBefore("abc", "a") = ""
- * StringUtils.substringBefore("abcba", "b") = "a"
- * StringUtils.substringBefore("abc", "c") = "ab"
- * StringUtils.substringBefore("abc", "d") = "abc"
- * StringUtils.substringBefore("abc", "") = ""
- * StringUtils.substringBefore("abc", null) = "abc"
- *
- *
- * @param str the String to get a substring from, may be null
- * @param separator the String to search for, may be null
- * @return the substring before the first occurrence of the separator,
- * null if null String input
- * @since 2.0
- */
- public static String substringBefore(String str, String separator) {
- if (isEmpty(str) || separator == null) {
- return str;
- }
- if (separator.length() == 0) {
- return EMPTY;
- }
- int pos = str.indexOf(separator);
- if (pos == INDEX_NOT_FOUND) {
- return str;
- }
- return str.substring(0, pos);
- }
-
- /**
- * null string input will return null.
- * An empty ("") string input will return the empty string.
- * A null separator will return the empty string if the
- * input string is not null.
- * StringUtils.substringAfter(null, *) = null
- * StringUtils.substringAfter("", *) = ""
- * StringUtils.substringAfter(*, null) = ""
- * StringUtils.substringAfter("abc", "a") = "bc"
- * StringUtils.substringAfter("abcba", "b") = "cba"
- * StringUtils.substringAfter("abc", "c") = ""
- * StringUtils.substringAfter("abc", "d") = ""
- * StringUtils.substringAfter("abc", "") = "abc"
- *
- *
- * @param str the String to get a substring from, may be null
- * @param separator the String to search for, may be null
- * @return the substring after the first occurrence of the separator,
- * null if null String input
- * @since 2.0
- */
- public static String substringAfter(String str, String separator) {
- if (isEmpty(str)) {
- return str;
- }
- if (separator == null) {
- return EMPTY;
- }
- int pos = str.indexOf(separator);
- if (pos == INDEX_NOT_FOUND) {
- return EMPTY;
- }
- return str.substring(pos + separator.length());
- }
-
- /**
- * null string input will return null.
- * An empty ("") string input will return the empty string.
- * An empty or null separator will return the input string.
- * StringUtils.substringBeforeLast(null, *) = null
- * StringUtils.substringBeforeLast("", *) = ""
- * StringUtils.substringBeforeLast("abcba", "b") = "abc"
- * StringUtils.substringBeforeLast("abc", "c") = "ab"
- * StringUtils.substringBeforeLast("a", "a") = ""
- * StringUtils.substringBeforeLast("a", "z") = "a"
- * StringUtils.substringBeforeLast("a", null) = "a"
- * StringUtils.substringBeforeLast("a", "") = "a"
- *
- *
- * @param str the String to get a substring from, may be null
- * @param separator the String to search for, may be null
- * @return the substring before the last occurrence of the separator,
- * null if null String input
- * @since 2.0
- */
- public static String substringBeforeLast(String str, String separator) {
- if (isEmpty(str) || isEmpty(separator)) {
- return str;
- }
- int pos = str.lastIndexOf(separator);
- if (pos == INDEX_NOT_FOUND) {
- return str;
- }
- return str.substring(0, pos);
- }
-
- /**
- * null string input will return null.
- * An empty ("") string input will return the empty string.
- * An empty or null separator will return the empty string if
- * the input string is not null.
- * StringUtils.substringAfterLast(null, *) = null
- * StringUtils.substringAfterLast("", *) = ""
- * StringUtils.substringAfterLast(*, "") = ""
- * StringUtils.substringAfterLast(*, null) = ""
- * StringUtils.substringAfterLast("abc", "a") = "bc"
- * StringUtils.substringAfterLast("abcba", "b") = "a"
- * StringUtils.substringAfterLast("abc", "c") = ""
- * StringUtils.substringAfterLast("a", "a") = ""
- * StringUtils.substringAfterLast("a", "z") = ""
- *
- *
- * @param str the String to get a substring from, may be null
- * @param separator the String to search for, may be null
- * @return the substring after the last occurrence of the separator,
- * null if null String input
- * @since 2.0
- */
- public static String substringAfterLast(String str, String separator) {
- if (isEmpty(str)) {
- return str;
- }
- if (isEmpty(separator)) {
- return EMPTY;
- }
- int pos = str.lastIndexOf(separator);
- if (pos == INDEX_NOT_FOUND || pos == (str.length() - separator.length())) {
- return EMPTY;
- }
- return str.substring(pos + separator.length());
- }
-
- // Substring between
- //-----------------------------------------------------------------------
- /**
- * null input String returns null.
- * A null tag returns null.
- * StringUtils.substringBetween(null, *) = null
- * StringUtils.substringBetween("", "") = ""
- * StringUtils.substringBetween("", "tag") = null
- * StringUtils.substringBetween("tagabctag", null) = null
- * StringUtils.substringBetween("tagabctag", "") = ""
- * StringUtils.substringBetween("tagabctag", "tag") = "abc"
- *
- *
- * @param str the String containing the substring, may be null
- * @param tag the String before and after the substring, may be null
- * @return the substring, null if no match
- * @since 2.0
- */
- public static String substringBetween(String str, String tag) {
- return substringBetween(str, tag, tag);
- }
-
- /**
- * null input String returns null.
- * A null open/close returns null (no match).
- * An empty ("") open and close returns an empty string.
- * StringUtils.substringBetween("wx[b]yz", "[", "]") = "b"
- * StringUtils.substringBetween(null, *, *) = null
- * StringUtils.substringBetween(*, null, *) = null
- * StringUtils.substringBetween(*, *, null) = null
- * StringUtils.substringBetween("", "", "") = ""
- * StringUtils.substringBetween("", "", "]") = null
- * StringUtils.substringBetween("", "[", "]") = null
- * StringUtils.substringBetween("yabcz", "", "") = ""
- * StringUtils.substringBetween("yabcz", "y", "z") = "abc"
- * StringUtils.substringBetween("yabczyabcz", "y", "z") = "abc"
- *
- *
- * @param str the String containing the substring, may be null
- * @param open the String before the substring, may be null
- * @param close the String after the substring, may be null
- * @return the substring, null if no match
- * @since 2.0
- */
- public static String substringBetween(String str, String open, String close) {
- if (str == null || open == null || close == null) {
- return null;
- }
- int start = str.indexOf(open);
- if (start != INDEX_NOT_FOUND) {
- int end = str.indexOf(close, start + open.length());
- if (end != INDEX_NOT_FOUND) {
- return str.substring(start + open.length(), end);
- }
- }
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/captcha/CaptchaController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/captcha/CaptchaController.java
index fbdd665e83..c10e602a72 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/captcha/CaptchaController.java
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/captcha/CaptchaController.java
@@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.system.controller.admin.captcha;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
+import com.anji.captcha.service.CaptchaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
@@ -10,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest;
@@ -24,24 +27,46 @@ import javax.servlet.http.HttpServletRequest;
@Api(tags = "管理后台 - 验证码")
@RestController("adminCaptchaController")
@RequestMapping("/system/captcha")
-public class CaptchaController extends com.anji.captcha.controller.CaptchaController {
+public class CaptchaController {
+
+ @Resource
+ private CaptchaService captchaService;
@PostMapping({"/get"})
@ApiOperation("获得验证码")
@PermitAll
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
- @Override
public ResponseModel get(@RequestBody CaptchaVO data, HttpServletRequest request) {
- return super.get(data, request);
+ assert request.getRemoteHost() != null;
+ data.setBrowserInfo(getRemoteId(request));
+ return captchaService.get(data);
}
@PostMapping("/check")
@ApiOperation("校验验证码")
@PermitAll
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
- @Override
public ResponseModel check(@RequestBody CaptchaVO data, HttpServletRequest request) {
- return super.check(data, request);
+ data.setBrowserInfo(getRemoteId(request));
+ return captchaService.check(data);
+ }
+
+ public static String getRemoteId(HttpServletRequest request) {
+ String xfwd = request.getHeader("X-Forwarded-For");
+ String ip = getRemoteIpFromXfwd(xfwd);
+ String ua = request.getHeader("user-agent");
+ if (StrUtil.isNotBlank(ip)) {
+ return ip + ua;
+ }
+ return request.getRemoteAddr() + ua;
+ }
+
+ private static String getRemoteIpFromXfwd(String xfwd) {
+ if (StrUtil.isNotBlank(xfwd)) {
+ String[] ipList = xfwd.split(",");
+ return StrUtil.trim(ipList[0]);
+ }
+ return null;
}
}