复制代码代码如下 :
paquet com.g.core.common.JCaptcha ;
importer java.awt.Color ;
importer java.awt.Font ;
importer com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator ;
importer com.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator ;
importer com.octo.captcha.component.image.color.RandomListColorGenerator ;
importer com.octo.captcha.component.image.fontgenerator.FontGenerator ;
importer com.octo.captcha.component.image.fontgenerator.RandomFontGenerator ;
importer com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster ;
importer com.octo.captcha.component.image.textpaster.TextPaster ;
importer com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator ;
importer com.octo.captcha.component.image.wordtoimage.ComposedWordToImage ;
importer com.octo.captcha.component.image.wordtoimage.WordToImage ;
importer com.octo.captcha.component.word.wordgenerator.RandomWordGenerator ;
importer com.octo.captcha.component.word.wordgenerator.WordGenerator ;
importer com.octo.captcha.engine.image.ListImageCaptchaEngine ;
importer com.octo.captcha.image.gimpy.GimpyFactory ;
/**
* 生成验证码图photo
*/
la classe publique JCaptchaEngine étend ListImageCaptchaEngine {
public static final String IMAGE_CAPTCHA_KEY = "imageCaptcha";// ImageCaptcha对象存放在Session中的key
public static final String CAPTCHA_INPUT_NAME = "j_captcha";//
public static final String CAPTCHA_IMAGE_URL = "/captcha.jpg";// URL de référence
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;// 验证码最大字体
chaîne finale statique privée RANDOM_WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机字符
private static final String IMAGE_PATH = "./captcha/";//
// 验证码随机字体
police finale statique privée[] RANDOM_FONT = new Font[] {
nouvelle police("nyala", Font.BOLD, MIN_FONT_SIZE),
nouvelle police("Arial", Font.BOLD, MIN_FONT_SIZE),
nouvelle police("Bell MT", Font.BOLD, MIN_FONT_SIZE),
new Font("Vallée du crédit", Font.BOLD, MIN_FONT_SIZE),
nouvelle police("Impact", Font.BOLD, MIN_FONT_SIZE)
} ;
// 验证码随机颜色
Private static final Color[] RANDOM_COLOR = new Color[] {
nouvelle couleur (255, 255, 255),
nouvelle couleur (255, 220, 220),
nouvelle couleur (220, 255, 255),
nouvelle couleur (220, 220, 255),
nouvelle couleur (255, 255, 220),
nouvelle couleur (220, 255, 220)
} ;
// 生成验证码
@Outrepasser
protégé void buildInitialFactories() {
RandomListColorGenerator randomListColorGenerator = new RandomListColorGenerator(RANDOM_COLOR);
BackgroundGenerator backgroundGenerator = nouveau FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PATH);
WordGenerator wordGenerator = nouveau RandomWordGenerator(RANDOM_WORD);
FontGenerator fontGenerator = new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, RANDOM_FONT);
TextDecorator[] textDecorator = nouveau TextDecorator[] {};
TextPaster textPaster = new DecoratedRandomTextPaster (MIN_WORD_LENGTH, MAX_WORD_LENGTH, randomListColorGenerator, textDecorator);
WordToImage wordToImage = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);
addFactory(nouveau GimpyFactory(wordGenerator, wordToImage));
}
}
复制代码代码如下 :
paquet com.g.core.common.JCaptcha ;
importer com.octo.captcha.service.captchastore.FastHashMapCaptchaStore ;
importer com.octo.captcha.service.image.DefaultManageableImageCaptchaService ;
importer com.octo.captcha.service.image.ImageCaptchaService ;
classe publique CaptchaServiceSingleton {
Instance ImageCaptchaService statique privée = null ;
public CaptchaServiceSingleton() {
}
// 使用synchronized关键字解决线程不安全
ImageCaptchaService statique synchronisé public getInstance() {
si (instance == null) {
instance = nouveau DefaultManageableImageCaptchaService (nouveau FastHashMapCaptchaStore(), nouveau JCaptchaEngine(), 180,
100 000, 75 000);
}
instance de retour ;
}
}
复制代码代码如下 :
paquet com.g.core.render ;
importer java.awt.image.BufferedImage ;
importer java.io.IOException ;
importer javax.imageio.ImageIO ;
importer javax.servlet.ServletOutputStream ;
importer com.g.core.common.JCaptcha.CaptchaServiceSingleton ;
importer com.jfinal.kit.StringKit ;
importer com.jfinal.render.Render ;
la classe publique JCaptchaRender étend le rendu {
chaîne privée randomCodeKey ;
public JCaptchaRender (String randomCodeKey) {
si (StringKit.isBlank(randomCodeKey))
throw new IllegalArgumentException("randomCodeKey ne peut pas être vide");
this.randomCodeKey = randomCodeKey;
}
@Outrepasser
rendu public vide() {
réponse.setHeader("Cache-Control", "no-store");
réponse.setHeader("Pragma", "no-cache");
réponse.setDateHeader("Expire", 0);
réponse.setContentType("image/jpeg");
ServletOutputStream sos = null ;
essayer {
sos = réponse.getOutputStream();
//String captchaId = request.getSession(true).getId();
BufferedImage challenge = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(randomCodeKey, request.getLocale());
ImageIO.write(défi, "jpg", sos);
sos.flush();
} attraper (Exception e) {
lancer une nouvelle RuntimeException(e);
}
enfin {
si (sos != nul)
essayez {sos.close();} catch (IOException e) {e.printStackTrace();}
}
}
}
复制代码代码如下 :
public void random_code() {
render(new JCaptchaRender(getSession().getId()));
}