提交 c890a846 编写于 作者: O o2sword

图片验证码优化

上级 1e9c1f76
...@@ -364,8 +364,8 @@ ...@@ -364,8 +364,8 @@
<artifactId>cache-ri-impl</artifactId> <artifactId>cache-ri-impl</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.whvcse</groupId> <groupId>com.github.penggle</groupId>
<artifactId>easy-captcha</artifactId> <artifactId>kaptcha</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.hadoop</groupId> <groupId>org.apache.hadoop</groupId>
...@@ -1084,9 +1084,9 @@ ...@@ -1084,9 +1084,9 @@
<version>1.1.1</version> <version>1.1.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.whvcse</groupId> <groupId>com.github.penggle</groupId>
<artifactId>easy-captcha</artifactId> <artifactId>kaptcha</artifactId>
<version>1.6.2</version> <version>2.3.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.hadoop</groupId> <groupId>org.apache.hadoop</groupId>
......
package com.x.program.center.jaxrs.captcha; package com.x.program.center.jaxrs.captcha;
import java.awt.Font; import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.util.Base64;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils; import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import com.wf.captcha.SpecCaptcha;
import com.x.base.core.container.EntityManagerContainer; import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory; import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.annotation.CheckPersistType; import com.x.base.core.entity.annotation.CheckPersistType;
import com.x.base.core.project.annotation.FieldDescribe; import com.x.base.core.project.annotation.FieldDescribe;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.http.ActionResult; import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.logger.Logger; import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory; import com.x.base.core.project.logger.LoggerFactory;
import com.x.program.center.core.entity.Captcha; import com.x.program.center.core.entity.Captcha;
import javax.imageio.ImageIO;
class V2Create extends BaseAction { class V2Create extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(V2Create.class); private static Logger logger = LoggerFactory.getLogger(V2Create.class);
...@@ -23,30 +28,28 @@ class V2Create extends BaseAction { ...@@ -23,30 +28,28 @@ class V2Create extends BaseAction {
ActionResult<Wo> execute(Integer width, Integer height) throws Exception { ActionResult<Wo> execute(Integer width, Integer height) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>(); ActionResult<Wo> result = new ActionResult<>();
if (width <= 80 && width > 800) { if (width <= 80 || width > 800) {
width = 80; width = 80;
} }
if (width <= 30 && width > 800) { if (height <= 30 || height > 800) {
width = 30; height = 30;
}
SpecCaptcha specCaptcha = new SpecCaptcha(width, height, 4);
specCaptcha.setCharType(com.wf.captcha.base.Captcha.TYPE_ONLY_NUMBER);
if (StringUtils.isNotBlank(Config.person().getCaptchaFont())) {
specCaptcha.setFont(new Font(Config.person().getCaptchaFont(), Font.PLAIN, 32));
} }
Producer producer = createProducer(width, height);
// 生成随机字符串
String verifyCode = producer.createText();
// 生成图片
BufferedImage bufferedImage = producer.createImage(verifyCode);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", stream);
emc.beginTransaction(Captcha.class); emc.beginTransaction(Captcha.class);
Captcha captcha = new Captcha(); Captcha captcha = new Captcha();
captcha.setAnswer(specCaptcha.text()); captcha.setAnswer(verifyCode);
emc.persist(captcha, CheckPersistType.all); emc.persist(captcha, CheckPersistType.all);
emc.commit(); emc.commit();
Wo wo = new Wo(); Wo wo = new Wo();
wo.setId(captcha.getId()); wo.setId(captcha.getId());
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { wo.setImage(Base64.getEncoder().encodeToString(stream.toByteArray()));
wo.setImage(specCaptcha.toBase64(""));
}
result.setData(wo); result.setData(wo);
return result; return result;
} }
...@@ -77,4 +80,22 @@ class V2Create extends BaseAction { ...@@ -77,4 +80,22 @@ class V2Create extends BaseAction {
} }
} }
private static Producer createProducer(Integer width, Integer height) {
Properties properties = new Properties();
properties.setProperty(Constants.KAPTCHA_BORDER, "no");
properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "105,179,90");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, width.toString());
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, height.toString());
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "40");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "1234567890");
//properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "5");
Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册