淺析Java驗(yàn)證碼生成庫(kù)JCaptcha
JCaptcha是非常強(qiáng)大的,不光是可以生成圖片式的驗(yàn)證碼,還可以生成聲音式的(新浪就使用了雙重驗(yàn)證碼)。本文簡(jiǎn)單的介紹了JCaptcha庫(kù)以及使用實(shí)例,下面一起來(lái)看看。
下載JCaptcha庫(kù)
maven依賴(lài)如此添加:
<dependency> <groupId>com.octo.captcha</groupId> <artifactId>jcaptcha</artifactId> <version>1.0</version> </dependency>
封裝了一個(gè)簡(jiǎn)單的類(lèi)
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.CaptchaEngine; import com.octo.captcha.engine.image.ListImageCaptchaEngine; import com.octo.captcha.image.gimpy.GimpyFactory; import java.awt.*; /** * 產(chǎn)生驗(yàn)證碼圖片的類(lèi) */ public class CapchaHelper { private static final Integer MIN_WORD_LENGTH = 4;// 驗(yàn)證碼最小長(zhǎng)度 private static final Integer MAX_WORD_LENGTH = 4;// 驗(yàn)證碼最大長(zhǎng)度 private static final Integer IMAGE_HEIGHT = 30;// 驗(yàn)證碼圖片高度 private static final Integer IMAGE_WIDTH = 130;// 驗(yàn)證碼圖片寬度 private static final Integer MIN_FONT_SIZE = 15;// 驗(yàn)證碼最小字體 private static final Integer MAX_FONT_SIZE = 15;// 驗(yàn)證碼最大字體 private static final String RANDOM_WORD = "0123456789";// 隨機(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) }; private static ListImageCaptchaEngine captchaEngine; public static CaptchaEngine getCaptchaEngine(final String imgPath) { if (captchaEngine == null) { synchronized (CapchaHelper.class) { if (captchaEngine == null && imgPath != null) { captchaEngine = new ListImageCaptchaEngine() { @Override protected void buildInitialFactories() { RandomListColorGenerator randomListColorGenerator = new RandomListColorGenerator(RANDOM_COLOR); BackgroundGenerator backgroundGenerator = new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, imgPath); 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)); } }; } } } return captchaEngine; } }
響應(yīng)網(wǎng)頁(yè)中對(duì)驗(yàn)正碼圖像的請(qǐng)求
可以定義一個(gè)servlet
響應(yīng)這個(gè)請(qǐng)求,如果用springMVC
,也可以用某個(gè)Controller
中的某個(gè)方法響應(yīng)這個(gè)請(qǐng)求,不管怎樣,都需要指定一個(gè)路徑對(duì)應(yīng)到servlet或controller
的方法,比如路徑是:”/aaa/captcha”
那么在響應(yīng)對(duì)這個(gè)路徑的請(qǐng)求的Servlet中可以這樣寫(xiě):
//獲取驗(yàn)證碼背景圖片的路徑,這路徑放了很多作為背景的圖像 String captcha_backgrounds = session.getServletContext().getRealPath("/WEB-INF/img/captcha"); CaptchaEngine ce = CapchaHelper.getCaptchaEngine(captcha_backgrounds); //需要admin網(wǎng)頁(yè)中用js定時(shí)從服務(wù)端獲取當(dāng)前的驗(yàn)證碼 Captcha captcha = ce.getNextCaptcha(); //為了驗(yàn)證,把captcha對(duì)象放到session中,以在客戶(hù)端提交驗(yàn)證碼時(shí)進(jìn)行驗(yàn)證 req.getSession().setAttribute("captcha", captcha); //獲取驗(yàn)證碼圖片,這是未壓縮的位圖 BufferedImage image = (BufferedImage) captcha.getChallenge(); resp.setContentType("image/jpeg"); ImageIO.write(image, "jpg", resp.getOutputStream());
如果用springMVC,就這樣寫(xiě):
//獲取驗(yàn)證碼背景圖片的路徑,這路徑放了很多作為背景的圖像 String captcha_backgrounds = session.getServletContext().getRealPath("/WEB-INF/img/captcha"); CaptchaEngine ce = CapchaHelper.getCaptchaEngine(captcha_backgrounds); //需要admin網(wǎng)頁(yè)中用js定時(shí)從服務(wù)端獲取當(dāng)前的驗(yàn)證碼 Captcha captcha = ce.getNextCaptcha(); //為了驗(yàn)證,把captcha對(duì)象放到session中,以在客戶(hù)端提交驗(yàn)證碼時(shí)進(jìn)行驗(yàn)證 session.setAttribute("captcha", captcha); //獲取驗(yàn)證碼圖片,這是未壓縮的位圖 BufferedImage image = (BufferedImage) captcha.getChallenge(); ByteArrayOutputStream bao=new ByteArrayOutputStream(); //應(yīng)縮成jpg并寫(xiě)到輸出流中 ImageIO.write(image, "jpg", bao); return bao.toByteArray();
這兩種方式,向客戶(hù)端返回的都是二進(jìn)制數(shù)據(jù)。
String captcha_backgrounds = session.getServletContext().getRealPath(“/WEB-INF/img/captcha”);
表示路徑/WEB-INF/img/captcha
下面放的是作為驗(yàn)證碼圖像的背景的多張圖片,必須是jpeg,大小可能沒(méi)限制,你可以自己試一下。
網(wǎng)頁(yè)中用 <IMG> 指向這個(gè)地址
<img id="captcha" src="/captcha_img" onclick="refreshCaptchaImg()" />
js函數(shù)refreshCaptchaImg()
響應(yīng)圖片的點(diǎn)擊,每點(diǎn)擊一次,就重新獲取一張新的驗(yàn)證碼圖片。如何重新獲取驗(yàn)正碼圖片呢?
只需改變img的src屬性,但這里是每次都是用同一個(gè)地址來(lái)設(shè)置這個(gè)屬性,這樣不會(huì)引起真正的刷新,所以方法refreshCaptchaImg()
是這樣實(shí)現(xiàn)的:
function refreshCaptchaImg() { //從服務(wù)端重新下載驗(yàn)證碼圖片 //給這個(gè)地加參數(shù)純?yōu)榱藦?qiáng)制刷新,否則由于src指向的url地址沒(méi)變,瀏覽器不會(huì)真正生刷新圖片 var now = new Date() $("#captcha").attr("src","/captcha_img?"+now.getTime());
以上就是Java中驗(yàn)證碼生成庫(kù)JCaptcha的介紹及使用,希望對(duì)大家學(xué)習(xí)java有所幫助。
- Java 隨機(jī)生成驗(yàn)證碼(支持大小寫(xiě)字母、數(shù)字、隨機(jī)字體)的實(shí)例
- Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法
- Java Web開(kāi)發(fā)之圖形驗(yàn)證碼的生成與使用方法
- java實(shí)現(xiàn)驗(yàn)證碼類(lèi)生成中文驗(yàn)證碼
- java圖片驗(yàn)證碼生成教程詳解
- java生成圖片驗(yàn)證碼示例程序
- java生成圖片驗(yàn)證碼實(shí)例代碼
- Java生成圖形驗(yàn)證碼工具類(lèi)
- java生成圖片驗(yàn)證碼示例代碼
- java實(shí)現(xiàn)簡(jiǎn)單驗(yàn)證碼生成
相關(guān)文章
mybatis foreach批量插入數(shù)據(jù):Oracle與MySQL區(qū)別介紹
這篇文章主要介紹了,需要的朋友可以參考下2018-01-01java8實(shí)現(xiàn)List中對(duì)象屬性的去重方法
這篇文章主要介紹了java8實(shí)現(xiàn)List中對(duì)象屬性的去重方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例
這篇文章主要介紹了Java序列化常見(jiàn)實(shí)現(xiàn)方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11動(dòng)力節(jié)點(diǎn)_王勇_DRP項(xiàng)目視頻教程完整版292集
該視頻由國(guó)內(nèi)知名講師王勇老師主講,適合掌握J(rèn)ava基礎(chǔ)內(nèi)容的同學(xué)學(xué)習(xí),本視頻共計(jì)292集,學(xué)習(xí)Java Web項(xiàng)目,DRP項(xiàng)目視頻是首選,累計(jì)下載量已經(jīng)達(dá)到上千萬(wàn),很多同學(xué)通過(guò)自學(xué)該視頻找到了軟件開(kāi)發(fā)工作2017-04-04Java代理模式之靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別及優(yōu)缺點(diǎn)
代理模式是一種常用的設(shè)計(jì)模式,它允許通過(guò)引入一個(gè)代理對(duì)象來(lái)控制對(duì)目標(biāo)對(duì)象的訪(fǎng)問(wèn),在Java中,代理模式被廣泛應(yīng)用,它可以提供額外的功能,如權(quán)限檢查、緩存、日志記錄等,本文將介紹靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別及優(yōu)缺點(diǎn),需要的朋友可以參考下2023-06-06線(xiàn)程池ThreadPoolExecutor使用簡(jiǎn)介與方法實(shí)例
今天小編就為大家分享一篇關(guān)于線(xiàn)程池ThreadPoolExecutor使用簡(jiǎn)介與方法實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟(完整代碼)
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java實(shí)現(xiàn)畫(huà)圖的詳細(xì)步驟展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06SpringSecurity+jwt+redis基于數(shù)據(jù)庫(kù)登錄認(rèn)證的實(shí)現(xiàn)
本文主要介紹了SpringSecurity+jwt+redis基于數(shù)據(jù)庫(kù)登錄認(rèn)證的實(shí)現(xiàn),其中也涉及到自定義的過(guò)濾器和處理器,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Java中的可變參數(shù)常見(jiàn)用法實(shí)例總結(jié)
這篇文章主要介紹了Java中的可變參數(shù)常見(jiàn)用法,結(jié)合實(shí)例形式總結(jié)分析了java可變參數(shù)的常見(jiàn)功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10