修复在并发场景下验证器生成多次的问题

This commit is contained in:
天爱有情
2023-04-12 08:44:26 +08:00
parent e1224446cb
commit 988ad07d34
@@ -18,6 +18,7 @@ import lombok.Setter;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/** /**
* @Author: 天爱有情 * @Author: 天爱有情
@@ -26,7 +27,7 @@ import java.util.Map;
*/ */
public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator { public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator {
protected Map<String, ImageCaptchaGenerator> imageCaptchaGeneratorMap = new HashMap<>(4); protected Map<String, ImageCaptchaGenerator> imageCaptchaGeneratorMap = new ConcurrentHashMap<>(4);
protected Map<String, ImageCaptchaGeneratorProvider> imageCaptchaGeneratorProviderMap = new HashMap<>(4); protected Map<String, ImageCaptchaGeneratorProvider> imageCaptchaGeneratorProviderMap = new HashMap<>(4);
@Setter @Setter
@@ -93,16 +94,14 @@ public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator {
} }
public ImageCaptchaGenerator requireGetCaptchaGenerator(String type) { public ImageCaptchaGenerator requireGetCaptchaGenerator(String type) {
ImageCaptchaGenerator imageCaptchaGenerator = imageCaptchaGeneratorMap.get(type); ImageCaptchaGenerator imageCaptchaGenerator = imageCaptchaGeneratorMap.computeIfAbsent(type, t -> {
if (imageCaptchaGenerator == null) { ImageCaptchaGeneratorProvider provider = imageCaptchaGeneratorProviderMap.get(t);
ImageCaptchaGeneratorProvider provider = imageCaptchaGeneratorProviderMap.get(type);
if (provider == null) { if (provider == null) {
throw new IllegalArgumentException("生成验证码失败,错误的type类型:" + type); throw new IllegalArgumentException("生成验证码失败,错误的type类型:" + t);
} }
imageCaptchaGenerator = imageCaptchaGeneratorMap.computeIfAbsent(type, k -> return provider.get(getImageResourceManager(), getImageTransform()).init(initDefaultResource);
// get and init });
provider.get(getImageResourceManager(), getImageTransform()).init(initDefaultResource));
}
return imageCaptchaGenerator; return imageCaptchaGenerator;
} }