jfinal添加jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法
package com.g.core.common.JCaptcha;
import java.awt.Color;
import java.awt.Font;
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomListColorGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
/**
* 生成驗(yàn)證碼圖片
*/
public class JCaptchaEngine extends ListImageCaptchaEngine {
public static final String IMAGE_CAPTCHA_KEY = "imageCaptcha";// ImageCaptcha對(duì)象存放在Session中的key
public static final String CAPTCHA_INPUT_NAME = "j_captcha";// 驗(yàn)證碼輸入表單名稱
public static final String CAPTCHA_IMAGE_URL = "/captcha.jpg";// 驗(yàn)證碼圖片URL
private static final Integer MIN_WORD_LENGTH = 4;// 驗(yàn)證碼最小長度
private static final Integer MAX_WORD_LENGTH = 4;// 驗(yàn)證碼最大長度
private static final Integer IMAGE_HEIGHT = 28;// 驗(yàn)證碼圖片高度
private static final Integer IMAGE_WIDTH = 80;// 驗(yàn)證碼圖片寬度
private static final Integer MIN_FONT_SIZE = 16;// 驗(yàn)證碼最小字體
private static final Integer MAX_FONT_SIZE = 16;// 驗(yàn)證碼最大字體
private static final String RANDOM_WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 隨機(jī)字符
private static final String IMAGE_PATH = "./captcha/";// 隨機(jī)背景圖片路徑
// 驗(yàn)證碼隨機(jī)字體
private static final Font[] RANDOM_FONT = new Font[] {
new Font("nyala", Font.BOLD, MIN_FONT_SIZE),
new Font("Arial", Font.BOLD, MIN_FONT_SIZE),
new Font("Bell MT", Font.BOLD, MIN_FONT_SIZE),
new Font("Credit valley", Font.BOLD, MIN_FONT_SIZE),
new Font("Impact", Font.BOLD, MIN_FONT_SIZE)
};
// 驗(yàn)證碼隨機(jī)顏色
private static final Color[] RANDOM_COLOR = new Color[] {
new Color(255, 255, 255),
new Color(255, 220, 220),
new Color(220, 255, 255),
new Color(220, 220, 255),
new Color(255, 255, 220),
new Color(220, 255, 220)
};
// 生成驗(yàn)證碼
@Override
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 = new 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));
}
}
package 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;
public class CaptchaServiceSingleton {
private static ImageCaptchaService instance =null;
public CaptchaServiceSingleton() {
}
// 使用synchronized關(guān)鍵字解決線程不安全
public synchronized static ImageCaptchaService getInstance() {
if (instance == null) {
instance = new DefaultManageableImageCaptchaService(new FastHashMapCaptchaStore(), new JCaptchaEngine(), 180,
100000 , 75000);
}
return instance;
}
}
package com.g.core.render;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import com.g.core.common.JCaptcha.CaptchaServiceSingleton;
import com.jfinal.kit.StringKit;
import com.jfinal.render.Render;
public class JCaptchaRender extends Render {
private String randomCodeKey;
public JCaptchaRender(String randomCodeKey) {
if (StringKit.isBlank(randomCodeKey))
throw new IllegalArgumentException("randomCodeKey can not be blank");
this.randomCodeKey = randomCodeKey;
}
@Override
public void render() {
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ServletOutputStream sos = null;
try {
sos = response.getOutputStream();
// String captchaId = request.getSession(true).getId();
BufferedImage challenge = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(randomCodeKey, request.getLocale());
ImageIO.write(challenge, "jpg", sos);
sos.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
finally {
if (sos != null)
try {sos.close();} catch (IOException e) {e.printStackTrace();}
}
}
}
public void random_code() {
render(new JCaptchaRender(getSession().getId()));
}
- JFinal使用ajaxfileupload實(shí)現(xiàn)圖片上傳及預(yù)覽
- JFinal實(shí)現(xiàn)偽靜態(tài)的方法
- JFinal極速開發(fā)框架使用筆記分享
- jfinal與bootstrap的登出實(shí)戰(zhàn)詳解
- java 中JFinal getModel方法和數(shù)據(jù)庫使用出現(xiàn)問題解決辦法
- Bootstrap+jfinal退出系統(tǒng)彈出確認(rèn)框的實(shí)現(xiàn)方法
- Bootstrap+jfinal實(shí)現(xiàn)省市級(jí)聯(lián)下拉菜單
- jfinal與bootstrap的登錄跳轉(zhuǎn)實(shí)戰(zhàn)演習(xí)
- Java中JFinal框架動(dòng)態(tài)切換數(shù)據(jù)庫的方法
相關(guān)文章
如何使用 Shell 腳本查看多個(gè)服務(wù)器的端口是否打開的方法
這篇文章主要介紹了如何使用 Shell 腳本來查看多個(gè)服務(wù)器的端口是否打開的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
mybatis攔截器注冊(cè)初始化編寫示例及如何生效詳解
這篇文章主要為大家介紹了mybatis攔截器注冊(cè)初始化編寫示例及如何生效詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
詳解如何獲取PreparedStatement參數(shù)示例詳解
這篇文章主要為大家介紹了詳解如何獲取PreparedStatement參數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
使用chatgpt實(shí)現(xiàn)微信聊天小程序的代碼示例
這篇文章主要介紹了使用chatgpt實(shí)現(xiàn)微信聊天小程序(秒回復(fù)),文中有詳細(xì)的代碼示例,對(duì)大家了解chatgpt聊天有一定的幫助,感興趣的同學(xué)可以參考閱讀2023-05-05
Spring Security實(shí)現(xiàn)微信公眾號(hào)網(wǎng)頁授權(quán)功能
這篇文章主要介紹了Spring Security中實(shí)現(xiàn)微信網(wǎng)頁授權(quán),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
java的main方法中調(diào)用spring的service方式
這篇文章主要介紹了在java的main方法中調(diào)用spring的service方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開發(fā)中的運(yùn)用
觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己.下面就以實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開發(fā)中的運(yùn)用2016-05-05
Java鎖的升級(jí)策略 偏向鎖 輕量級(jí)鎖 重量級(jí)鎖
在本文中小編給的大家整理了關(guān)于Java鎖的升級(jí)策略 偏向鎖 輕量級(jí)鎖 重量級(jí)鎖的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。2019-06-06

