複製程式碼如下:
包 com.g.core.common.JCaptcha;
導入java.awt.Color;
導入java.awt.Font;
導入 com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
導入 com.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;
導入 com.octo.captcha.component.image.color.RandomListColorGenerator;
導入 com.octo.captcha.component.image.fontgenerator.FontGenerator;
導入 com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
導入 com.octo.captcha.component.image.textpaster.DecolatedRandomTextPaster;
導入 com.octo.captcha.component.image.textpaster.TextPaster;
導入 com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
導入 com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
導入 com.octo.captcha.component.image.wordtoimage.WordToImage;
導入 com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
導入 com.octo.captcha.component.word.wordgenerator.WordGenerator;
導入 com.octo.captcha.engine.image.ListImageCaptchaEngine;
導入 com.octo.captcha.image.gimpy.GimpyFactory;
/**
* 產生驗證碼圖片
*/
公共類別 JCaptchaEngine 擴充 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
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/";//隨機背景圖路徑
// 驗證碼隨機字體
私人靜態最終字體[] RANDOM_FONT = 新字體[] {
新字體(“nyala”,Font.BOLD,MIN_FONT_SIZE),
新字體(“Arial”,Font.BOLD,MIN_FONT_SIZE),
新字體(“貝爾MT”,Font.BOLD,MIN_FONT_SIZE),
new Font("信用谷", Font.BOLD, MIN_FONT_SIZE),
新字體(“影響力”,Font.BOLD,MIN_FONT_SIZE)
};
//驗證碼隨機顏色
私有靜態最終顏色[] RANDOM_COLOR = 新顏色[] {
新顏色(255, 255, 255),
新色(255, 220, 220),
新色(220, 255, 255),
新色(220, 220, 255),
新色(255, 255, 220),
新色(220, 255, 220)
};
// 產生驗證碼
@覆蓋
受保護的無效buildInitialFactories(){
RandomListColorGenerator randomListColorGenerator = new RandomListColorGenerator(RANDOM_COLOR);
背景產生器 背景產生器 = 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 = new TextDecorator[] {};
TextPaster textPaster = new DecoratedRandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, randomListColorGenerator, textDecorator);
WordToImage wordToImage = new CompositWordToImage(fontGenerator, backgroundGenerator, textPaster);
addFactory(new GimpyFactory(wordGenerator, wordToImage));
}
}
複製程式碼如下:
包 com.g.core.common.JCaptcha;
導入 com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
導入 com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
導入 com.octo.captcha.service.image.ImageCaptchaService;
公共類別 CaptchaServiceSingleton {
私有靜態 ImageCaptchaService 實例 =null;
公共 CaptchaServiceSingleton() {
}
// 使用同步關鍵字解決執行緒不安全
公用同步靜態 ImageCaptchaService getInstance() {
如果(實例==空){
實例=新的DefaultManageableImageCaptchaService(新的FastHashMapCaptchaStore(),新的JCaptchaEngine(),180,
100000、75000);
}
返回實例;
}
}
複製程式碼如下:
包 com.g.core.render;
導入java.awt.image.BufferedImage;
導入java.io.IOException;
導入 javax.imageio.ImageIO;
導入 javax.servlet.ServletOutputStream;
導入 com.g.core.common.JCaptcha.CaptchaServiceSingleton;
導入 com.jfinal.kit.StringKit;
導入 com.jfinal.render.Render;
公共類別 JCaptchaRender 擴充 Render {
私有字符串隨機代碼密鑰;
公共 JCaptchaRender(字串 randomCodeKey) {
if (StringKit.isBlank(randomCodeKey))
throw new IllegalArgumentException("randomCodeKey 不能為空");
this.randomCodeKey = randomCodeKey;
}
@覆蓋
公共無效渲染(){
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "無快取");
response.setDateHeader("過期", 0);
響應.setContentType(“圖像/jpeg”);
ServletOutputStream sos = null;
嘗試 {
sos = response.getOutputStream();
//字串 captchaId = request.getSession(true).getId();
BufferedImage 挑戰 = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(randomCodeKey, request.getLocale());
ImageIO.write(挑戰, "jpg", sos);
sos.flush();
} catch (異常 e) {
拋出新的運行時異常(e);
}
最後 {
if (sos!= null)
試試 {sos.close();} catch (IOException e) {e.printStackTrace();}
}
}
}
複製程式碼如下:
公共無效隨機代碼(){
渲染(new JCaptchaRender(getSession().getId()));
}