复代码代码如下:
패키지 com.g.core.common.JCaptcha;
import java.awt.Color;
import java.awt.Font;
수입 com.octo.captcha.comComponent.image.Backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.comComponent.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;
import com.octo.captcha.comComponent.image.color.RandomListColorGenerator;
import com.octo.captcha.comComponent.image.fontgenerator.FontGenerator;
import com.octo.captcha.comComponent.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.comComponent.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.comComponent.image.textpaster.TextPaster;
import com.octo.captcha.comComponent.image.textpaster.textdecorator.TextDecorator;
com.octo.captcha.comComponent.image.wordtoimage.ComposedWordToImage를 가져옵니다.
import com.octo.captcha.comComponent.image.wordtoimage.WordToImage;
import com.octo.captcha.comComponent.word.wordgenerator.RandomWordGenerator;
수입 com.octo.captcha.comComponent.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
/**
* 生成验证码사진
*/
공개 클래스 JCaptchaEngine은 ListImageCaptchaEngine을 확장합니다.
public static final String IMAGE_CAPTCHA_KEY = "imageCaptcha";// ImageCaptcha对象存放재세션중적키
public static final String CAPTCHA_INPUT_NAME = "j_captcha";// 验证码输入表单name称
public static final String CAPTCHA_IMAGE_URL = "/captcha.jpg";// 验证码图文URL
private static final Integer MIN_WORD_LENGTH = 4;// 验证码最小长島
private static final Integer MAX_WORD_LENGTH = 4;// 验证码最大长島
private static final Integer IMAGE_HEIGHT = 28;// 验证码图그림 높이
private static final Integer IMAGE_WIDTH = 80;// 验证码图文宽˚
private static final Integer MIN_FONT_SIZE = 16;// 验证码最小字体
private static final Integer MAX_FONT_SIZE = 16;// 验证码最大字体
private static final String RANDOM_WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机字符
private static final String IMAGE_PATH = "./captcha/";// 随机背景图文路径
// 验证码随机字体
private static final Font[] RANDOM_FONT = new Font[] {
새 글꼴("nyala", Font.BOLD, MIN_FONT_SIZE),
새 글꼴("Arial", Font.BOLD, MIN_FONT_SIZE),
새 글꼴("Bell MT", Font.BOLD, MIN_FONT_SIZE),
new Font("신용 계곡", Font.BOLD, MIN_FONT_SIZE),
새 글꼴("영향", Font.BOLD, MIN_FONT_SIZE)
};
// 验证码随机颜color
private static final Color[] RANDOM_COLOR = new Color[] {
새로운 색상(255, 255, 255),
새로운 색상(255, 220, 220),
새로운 색상(220, 255, 255),
새로운 색상(220, 220, 255),
새로운 색상(255, 255, 220),
새로운 색상(220, 255, 220)
};
//생성验证码
@보수
protected void buildInitialFactories() {
RandomListColorGenerator randomListColorGenerator = new RandomListColorGenerator(RANDOM_COLOR);
BackgroundGenerator backgroundGenerator = new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PATH);
WordGenerator wordGenerator = new RandomWordGenerator(RANDOM_WORD);
FontGenerator FontGenerator = new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, RANDOM_FONT);
TextDecorator[] textDecorator = 새로운 TextDecorator[] {};
TextPaster textPaster = new DecoratedRandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, randomListColorGenerator, textDecorator);
WordToImage wordToImage = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);
addFactory(new GimpyFactory(wordGenerator, wordToImage));
}
}
复代码代码如下:
패키지 com.g.core.common.JCaptcha;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
공개 클래스 CaptchaServiceSingleton {
개인 정적 ImageCaptchaService 인스턴스 =null;
공개 CaptchaServiceSingleton() {
}
// 동기화된 关键字解决线程불안전
공개 동기화 정적 ImageCaptchaService getInstance() {
if (인스턴스 == null) {
인스턴스 = new DefaultManageableImageCaptchaService(new FastHashMapCaptchaStore(), new JCaptchaEngine(), 180,
100000, 75000);
}
반환 인스턴스;
}
}
复代码代码如下:
패키지 com.g.core.render;
import java.awt.image.BufferedImage;
import java.io.IOException;
javax.imageio.ImageIO 가져오기;
import javax.servlet.ServletOutputStream;
import com.g.core.common.JCaptcha.CaptchaServiceSingleton;
import com.jfinal.kit.StringKit;
import com.jfinal.render.Render;
공개 클래스 JCaptchaRender는 Render {를 확장합니다.
개인 문자열 randomCodeKey;
공개 JCaptchaRender(String randomCodeKey) {
if(StringKit.isBlank(randomCodeKey))
throw new IllegalArgumentException("randomCodeKey는 비워둘 수 없습니다.");
this.randomCodeKey = 무작위코드키;
}
@보수
공공 무효 렌더링() {
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("만료", 0);
response.setContentType("image/jpeg");
ServletOutputStream sos = null;
노력하다 {
sos = response.getOutputStream();
//문자열 captchaId = request.getSession(true).getId();
BufferedImage 챌린지 = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(randomCodeKey, request.getLocale());
ImageIO.write(challenge, "jpg", sos);
sos.flush();
} 잡기(예외 e) {
새로운 RuntimeException(e)을 던져라;
}
마지막으로 {
if (sos != null)
{sos.close();} catch(IOException e) {e.printStackTrace();}를 시도해 보세요.
}
}
}
复代码代码如下:
공공 무효 random_code() {
render(new JCaptchaRender(getSession().getId()));
}