王平根
(井岡山大學(xué)電子與信息工程學(xué)院,江西 吉安343009)
基于Java的圖形驗(yàn)證碼設(shè)計(jì)與實(shí)現(xiàn)
王平根
(井岡山大學(xué)電子與信息工程學(xué)院,江西 吉安343009)
本文簡(jiǎn)單介紹了圖形驗(yàn)證碼的應(yīng)用,詳細(xì)描述了Java圖形驗(yàn)證碼的設(shè)計(jì)原理和實(shí)現(xiàn)方法,同時(shí),以數(shù)字和字母混合圖形驗(yàn)證碼為例給出了程序段及驗(yàn)證圖片。
圖形驗(yàn)證碼;Java Web;安全
驗(yàn)證碼的應(yīng)用十分普遍。驗(yàn)證碼一般是防止批量注冊(cè)的,人眼看起來(lái)都費(fèi)勁。二像百度貼吧未登錄發(fā)貼要輸入驗(yàn)證碼大概是防止大規(guī)模匿名回帖的發(fā)生;目前,不少網(wǎng)站為了防止用戶利用機(jī)器人自動(dòng)注冊(cè)、登錄、灌水,都采用了驗(yàn)證碼技術(shù),在一般注冊(cè)用戶ID的地方以及各大論壇都要要輸入驗(yàn)證碼;在購(gòu)買(mǎi)火車票時(shí)為了減緩黃牛使用程序強(qiáng)票,購(gòu)票前要輸入驗(yàn)證碼;為防止程序惡意登錄,在登錄時(shí)要輸入驗(yàn)證碼等等。所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識(shí)別其中的驗(yàn)證碼信息,輸入表單提交網(wǎng)站驗(yàn)證,驗(yàn)證成功后才能使用某項(xiàng)功能。
驗(yàn)證碼是一張圖片,圖片中有存有一些信息,該信息在后臺(tái)保留一份,且每次觸發(fā)一事件時(shí),都會(huì)導(dǎo)致該圖片和后臺(tái)的信息同步更新。Java中就是在servlet中隨機(jī)生成一個(gè)指定位置的驗(yàn)證碼,一般為四位,然后把該驗(yàn)證碼保存到session中,在通過(guò)Java的繪圖類以圖片的形式輸出該驗(yàn)證碼。該圖片上的信息通常較難識(shí)別,帶有干擾線,或一些扭曲的信息。該圖片是給用戶看的,并讓用戶識(shí)別圖片中的信息。用戶填寫(xiě)正確的信息后,才能進(jìn)行某些操作。我們之所以這樣做的原因是為了防止某些人員利用自己編寫(xiě)的程序來(lái)對(duì)我們的系統(tǒng)進(jìn)行一些破壞,因?yàn)槌绦蚴呛茈y識(shí)別圖片中的信息的,特別是加了干擾信息的圖片,這就避免了一些外部程序?qū)ο到y(tǒng)的破壞行為。
我們?cè)贘ava中寫(xiě)一個(gè)專門(mén)用于生成驗(yàn)證碼的Servlet,該Servlet調(diào)用了java類庫(kù)中的BufferedImage和Graphics等一系列的類來(lái)生成圖片,圖片中的信息是通過(guò)生成隨機(jī)數(shù)的方式確定下來(lái)的,再將信息寫(xiě)入到圖片中。接下來(lái)將輸入的信息通過(guò)保存在Session(會(huì)話對(duì)象)對(duì)象中,可以和前臺(tái)的數(shù)據(jù)進(jìn)行比對(duì)。最后通過(guò)IO將生成的圖片寫(xiě)回到客戶端,就是我們看到的驗(yàn)證碼,如何確定驗(yàn)證碼生成的位置,只要通過(guò)Html中的<img/>標(biāo)簽的href屬性為Servlet的映射路徑,img標(biāo)簽會(huì)應(yīng)用到Servlet生成的圖片。
圖形驗(yàn)證碼有很多類型,一般有數(shù)字的、字母的及數(shù)字和字母組合的驗(yàn)證碼等等。本文只給出以數(shù)字和字母混合圖形驗(yàn)證碼的程序段及驗(yàn)證圖片,其它的不作介紹。值得說(shuō)明的是要安裝好相應(yīng)的運(yùn)行軟件。程序片段和驗(yàn)證圖片如下:
……
<title>數(shù)字字母混合驗(yàn)證碼</title>
<!--<link rel="stylesheet"type="text/css"href="./styles.css">-->
</head>
<body>
${requestScope.loginmessage}
<br/>
<form action="/myhomework/login"method="post">
<br/> 請(qǐng) 輸 入 驗(yàn) 證 碼 :<input type="text"name="
checkimage"> <img
src="/myhomework/image3"id="CheckCode"></img><a
href="#"
onclick="myReload()">點(diǎn)擊,換一個(gè)</a><br/>
</form>
</body>
……
驗(yàn)證圖片:
基于安全性方面的考慮,大多數(shù)登錄時(shí)需要輸入一個(gè)驗(yàn)證碼,這說(shuō)明圖形驗(yàn)證碼在應(yīng)用中非常重要。在Java Web開(kāi)發(fā)中,圖形驗(yàn)證碼是普遍使用的一項(xiàng)技術(shù)。本文只介紹了 Java圖片驗(yàn)證碼的一般原理和實(shí)現(xiàn)方法,大家通過(guò)編程,使用Java Web中的servlet以及Jcaptcha、Kaptcha兩種開(kāi)源組件來(lái)實(shí)現(xiàn)各式各樣的驗(yàn)證碼,使之應(yīng)用更廣泛、更安全。
[1]李仲尉,王國(guó)輝,等.Java范例完全自學(xué)手冊(cè)[M].北京:人民郵電出版社,2009: 21-25.
[2]呂海東,張坤.ava EE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)實(shí)例教程.北京:清華大學(xué)出版社,2010,9.
[3]潘勇.Java Web網(wǎng)站通用圖形驗(yàn)證碼的實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2012 (18).
[責(zé)任編輯:李書(shū)培]