探討Java驗(yàn)證碼制作(上篇)
相信大家對(duì)驗(yàn)證碼這玩意不會(huì)陌生,無(wú)論是申請(qǐng)賬號(hào)還是某些情況下登錄時(shí)都會(huì)要求輸入驗(yàn)證碼。經(jīng)過(guò)統(tǒng)計(jì),驗(yàn)證碼一次驗(yàn)證就成功通過(guò)的概率是90%,并不高,那么很多人對(duì)于這種降低用戶體驗(yàn)度的設(shè)計(jì)肯定會(huì)懷疑他的必要性,但黑格爾說(shuō)過(guò):凡是合乎理性的東西都是現(xiàn)實(shí)的;凡是現(xiàn)實(shí)的東西都是合乎理性的。接下來(lái)我們來(lái)了解一下驗(yàn)證碼。
驗(yàn)證碼是一種區(qū)別用戶是計(jì)算機(jī)還是人的公共全自動(dòng)程序,他被用于防止惡意破解密碼、刷票、論壇灌水,防止黑客通過(guò)暴力破解方式不斷地登錄,應(yīng)用于銀行、社區(qū)、論壇、投票系統(tǒng)等等。
廢話不多說(shuō)我們來(lái)看看我已知的用Java實(shí)現(xiàn)驗(yàn)證碼的四種方式。
方法一:
第一種方法是我最先想到的,也是實(shí)現(xiàn)邏輯最簡(jiǎn)單的,但效率、安全性極其不高。





具體操作就是:1、用photoshop制作出驗(yàn)證碼圖片,矩形圖片上可有必要的英文字母、數(shù)字或中文(如上)
2、將圖片顯示在swing控件中或是jsp頁(yè)面中
3、在代碼中為每張圖片匹配上相應(yīng)的驗(yàn)證碼字符串
4、在提交時(shí)獲取組件或文本框中的字符串與每張圖片的字符串用equals()方法進(jìn)行比較
缺憾就是制作驗(yàn)證碼圖片的過(guò)程太費(fèi)時(shí),實(shí)現(xiàn)方法極low,極不推薦這樣實(shí)現(xiàn),下面的方法將越來(lái)越高效美觀相對(duì)安全。
方法二:
這里講Java Web,Servlet下的驗(yàn)證碼實(shí)現(xiàn),實(shí)現(xiàn)起來(lái)邏輯還是很清晰的。

省去較簡(jiǎn)單的實(shí)現(xiàn)代碼,我們先從前臺(tái)關(guān)鍵代碼說(shuō)起:
當(dāng)我們點(diǎn)擊"看不清"時(shí),驗(yàn)證碼圖片會(huì)進(jìn)行一個(gè)刷新,會(huì)調(diào)用一個(gè)js函數(shù)用于重新設(shè)置圖片路徑來(lái)更換圖片,請(qǐng)看下面代碼,代碼中<%=request.getContextPath()%>是為了解決相對(duì)路徑的問(wèn)題,可返回站點(diǎn)的根路徑,而/servlet/ImageServlet是一個(gè)整體,指向的就是ImageServlet這個(gè)servlet,為什么要在之前加個(gè)/servlet呢,因?yàn)槲覀冊(cè)趙eb.xml中做了配置映射,可理解為換了個(gè)更長(zhǎng)的名稱。接著看下面js函數(shù),可能有些人會(huì)有疑問(wèn),為什么獲取一個(gè)當(dāng)前時(shí)間然后加在路徑最后呢,其實(shí)這是為了解決瀏覽器緩存的問(wèn)題,就是當(dāng)觸發(fā)了ImageServlet后雖然驗(yàn)證碼圖片換了但緩存還沒(méi)變顯示出來(lái)的驗(yàn)證碼圖片不變的問(wèn)題,借助每時(shí)每刻時(shí)間不同可以讓瀏覽器緩存失效。
<script type="text/javascript">
function reloadCode(){
var time = new Date().getTime();
document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
}
</script>
下面是web.xml中的關(guān)鍵配置信息:
<script type="text/javascript">
function reloadCode(){
var time = new Date().getTime();
document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
}
</script>
然后我們看關(guān)鍵的ImageServlet是怎么生成圖片的:

<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>com.muke.ImageServlet</servlet-class> </servlet> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.muke.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/servlet/ImageServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/servlet/LoginServlet</url-pattern> </servlet-mapping>
如果要更生動(dòng)的描述這種驗(yàn)證碼是怎么樣來(lái)實(shí)現(xiàn)的,那么就一個(gè)字“畫”,聽上去和第一種方法類似,還是比較low,但是用代碼來(lái)自動(dòng)“畫”出驗(yàn)證碼效率絕對(duì)翻了無(wú)數(shù)倍。我們來(lái)看上述代碼,首先實(shí)例化了一個(gè)BufferedImage對(duì)象bi,bi是用來(lái)畫出那張驗(yàn)證碼圖片的,然后用bi得到一支畫筆g,用g畫出了實(shí)體的矩形背景,接著用簡(jiǎn)單的邏輯通過(guò)畫筆g調(diào)用Java中常用的drawString()方法在矩形上畫出驗(yàn)證碼字符,同時(shí)將字符串依次加入StringBuffer可變字符串對(duì)象中,最后存入jsp內(nèi)置對(duì)象session中以便提交驗(yàn)證碼后的比對(duì),為了顯示出驗(yàn)證碼,我們還需將生成驗(yàn)證碼圖片以某種圖片格式寫入ImageIO流。
下面LoginServlet中可以看出,獲取剛剛ImageServlet存入session的字符串就可以進(jìn)行與驗(yàn)證碼提交框中字符串的比對(duì)了,可以把字符串都變?yōu)樾懟虼髮懽鲆粋€(gè)忽略大小寫的處理。
public class ImageServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
BufferedImage bi = new BufferedImage(,,BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
Color c = new Color(,,);
g.setColor(c);
g.fillRect(, , , );
char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
Random r = new Random();
int len=ch.length,index;
StringBuffer sb = new StringBuffer();
for(int i=; i<; i++){
index = r.nextInt(len);
g.setColor(new Color(r.nextInt(),r.nextInt(),r.nextInt()));
g.drawString(ch[index]+"", (i*)+, );
sb.append(ch[index]);
}
request.getSession().setAttribute("piccode", sb.toString());
ImageIO.write(bi, "JPG", response.getOutputStream());
}
}
下面是實(shí)現(xiàn)圖例:


以上所述是小編給大家介紹的Java驗(yàn)證碼制作的相關(guān)知識(shí),希望對(duì)大家有所幫助!后續(xù)給大家介紹java驗(yàn)證碼制作(下),感興趣的朋友敬請(qǐng)關(guān)注腳本之家網(wǎng)站!
- Java Web開發(fā)過(guò)程中登陸模塊的驗(yàn)證碼的實(shí)現(xiàn)方式總結(jié)
- 探討Java驗(yàn)證碼制作(下篇)
- Javaweb開發(fā)中通過(guò)Servlet生成驗(yàn)證碼圖片
- 基于JAVA的短信驗(yàn)證碼api調(diào)用代碼實(shí)例
- java驗(yàn)證碼生成具體代碼
- java生成圖片驗(yàn)證碼實(shí)例代碼
- Java版仿QQ驗(yàn)證碼風(fēng)格圖片驗(yàn)證碼
- java實(shí)用驗(yàn)證碼的實(shí)現(xiàn)代碼
- java下使用kaptcha生成驗(yàn)證碼
- Java Web項(xiàng)目中驗(yàn)證碼功能的制作攻略
相關(guān)文章
SpringSecurity在單機(jī)環(huán)境下使用方法詳解
本文詳細(xì)介紹了SpringSecurity和SpringBoot的整合過(guò)程,包括配置用戶認(rèn)證、JSP頁(yè)面的使用、數(shù)據(jù)庫(kù)認(rèn)證以及授權(quán)功能的實(shí)現(xiàn),感興趣的朋友一起看看吧2025-02-02
Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例
這篇文章主要介紹了Spring-AOP自動(dòng)創(chuàng)建代理之BeanNameAutoProxyCreator實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring Boot啟動(dòng)流程斷點(diǎn)過(guò)程解析
這篇文章主要介紹了Spring Boot啟動(dòng)流程斷點(diǎn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
mybatis攔截器無(wú)法注入spring bean的問(wèn)題解決
本文主要介紹了mybatis攔截器無(wú)法注入spring bean的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
Java中獲取時(shí)間戳的三種方式對(duì)比實(shí)現(xiàn)
這篇文章主要介紹了Java中獲取時(shí)間戳的三種方式對(duì)比實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

