复制代码代码如下:
paquete com.g.core.common.JCaptcha;
importar java.awt.Color;
importar java.awt.Font;
importar com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
importar com.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;
importar com.octo.captcha.component.image.color.RandomListColorGenerator;
importar com.octo.captcha.component.image.fontgenerator.FontGenerator;
importar com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
importar com.octo.captcha.component.image.textpaster.DecoatedRandomTextPaster;
importar com.octo.captcha.component.image.textpaster.TextPaster;
importar com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
importar com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
importar com.octo.captcha.component.image.wordtoimage.WordToImage;
importar com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
importar com.octo.captcha.component.word.wordgenerator.WordGenerator;
importar com.octo.captcha.engine.image.ListImageCaptchaEngine;
importar com.octo.captcha.image.gimpy.GimpyFactory;
/**
* 生成验证码图fotos
*/
la clase pública JCaptchaEngine extiende ListImageCaptchaEngine {
cadena final estática pública IMAGE_CAPTCHA_KEY = "imageCaptcha";// ImageCaptcha对象存放在Session中的key
cadena final estática pública CAPTCHA_INPUT_NAME = "j_captcha";// 验证码输入表单名称
cadena final estática pública CAPTCHA_IMAGE_URL = "/captcha.jpg";// 验证码图片URL
Entero final estático privado MIN_WORD_LENGTH = 4;// 验证码最小长度
Entero final estático privado MAX_WORD_LENGTH = 4;// 验证码最大长度
Entero final estático privado IMAGE_HEIGHT = 28;// 验证码图片高度
Entero final estático privado IMAGE_WIDTH = 80;// 验证码图片宽度
Entero final estático privado MIN_FONT_SIZE = 16;// 验证码最小字体
Entero final estático privado MAX_FONT_SIZE = 16;// 验证码最大字体
Cadena final estática privada RANDOM_WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机字符
cadena final estática privada IMAGE_PATH = "./captcha/";// 随机背景图片路径
// 验证码随机字体
Fuente final estática privada [] RANDOM_FONT = nueva fuente [] {
nueva fuente("nyala", Font.BOLD, MIN_FONT_SIZE),
nueva fuente("Arial", Font.BOLD, MIN_FONT_SIZE),
nueva fuente ("Bell MT", Font.BOLD, MIN_FONT_SIZE),
nueva fuente ("Valle de crédito", Font.BOLD, MIN_FONT_SIZE),
nueva fuente("Impacto", Font.BOLD, MIN_FONT_SIZE)
};
// 验证码随机颜色
Color final estático privado[] RANDOM_COLOR = nuevo Color[] {
nuevo color (255, 255, 255),
nuevo color (255, 220, 220),
nuevo color (220, 255, 255),
nuevo color (220, 220, 255),
nuevo color (255, 255, 220),
nuevo color(220, 255, 220)
};
// 生成验证码
@Anular
vacío protegido buildInitialFactories() {
RandomListColorGenerator randomListColorGenerator = nuevo RandomListColorGenerator(RANDOM_COLOR);
BackgroundGenerator backgroundGenerator = nuevo FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PATH);
WordGenerator wordGenerator = nuevo RandomWordGenerator(RANDOM_WORD);
FontGenerator fontGenerator = nuevo RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, RANDOM_FONT);
TextDecorator[] textDecorator = nuevo TextDecorator[] {};
TextPaster textPaster = nuevo DecoratedRandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, randomListColorGenerator, textDecorator);
WordToImage wordToImage = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);
addFactory(new GimpyFactory(wordGenerator, wordToImage));
}
}
复制代码代码如下:
paquete com.g.core.common.JCaptcha;
importar com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
importar com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
importar com.octo.captcha.service.image.ImageCaptchaService;
clase pública CaptchaServiceSingleton {
instancia privada estática de ImageCaptchaService = nula;
público CaptchaServiceSingleton() {
}
// 使用sincronizado关键字解决线程不安全
ImageCaptchaService estático sincronizado público getInstance() {
si (instancia == nulo) {
instancia = nuevo DefaultManageableImageCaptchaService (nuevo FastHashMapCaptchaStore(), nuevo JCaptchaEngine(), 180,
100.000, 75.000);
}
instancia de devolución;
}
}
复制代码代码如下:
paquete com.g.core.render;
importar java.awt.image.BufferedImage;
importar java.io.IOException;
importar javax.imageio.ImageIO;
importar javax.servlet.ServletOutputStream;
importar com.g.core.common.JCaptcha.CaptchaServiceSingleton;
importar com.jfinal.kit.StringKit;
importar com.jfinal.render.Render;
clase pública JCaptchaRender extiende Render {
cadena privada randomCodeKey;
público JCaptchaRender (cadena randomCodeKey) {
si (StringKit.isBlank (randomCodeKey))
throw new IllegalArgumentException ("randomCodeKey no puede estar en blanco");
this.randomCodeKey = randomCodeKey;
}
@Anular
renderizado vacío público() {
respuesta.setHeader("Control de caché", "sin almacenamiento");
respuesta.setHeader("Pragma", "sin caché");
respuesta.setDateHeader("Expira", 0);
respuesta.setContentType("imagen/jpeg");
ServletOutputStream sos = nulo;
intentar {
sos = respuesta.getOutputStream();
//String captchaId = request.getSession(true).getId();
Desafío BufferedImage = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(randomCodeKey, request.getLocale());
ImageIO.write(desafío, "jpg", sos);
sos.flush();
} captura (Excepción e) {
lanzar nueva RuntimeException(e);
}
finalmente {
si (sos != nulo)
prueba {sos.close();} captura (IOException e) {e.printStackTrace();}
}
}
}
复制代码代码如下:
código_aleatorio vacío público() {
render(new JCaptchaRender(getSession().getId()));
}