JAVA隨機(jī)生成驗(yàn)證碼(一)

<b style=“font-color:red;”>圖片驗(yàn)證碼原理:</b>服務(wù)器生成包含隨機(jī)字符的字符串圖片發(fā)給客戶端搂抒,客戶端提交數(shù)據(jù)需要填寫字符串作為驗(yàn)證持寄。而字符串保存在圖片中,機(jī)器難以識(shí)別伊磺,達(dá)到防止有人利用程序惡意發(fā)送信息的目的官套。

JAVA隨機(jī)生成圖片

JAVA隨機(jī)生成圖片步驟如下:

  1. 創(chuàng)建圖片緩存區(qū) 傳參為寬高和圖片類型
BufferedImage bi = new 
BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  1. 獲取畫筆并繪畫
Graphics g = bi.getGraphics();  //獲取畫筆
g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//設(shè)置字體
g.setColor(color);//設(shè)置畫筆顏色
g.fillRect(0, 0, width, height);   //繪制背景
  1. 輸出圖片
    ImageIO.write(bi, "JPG", resp.getOutputStream());
JAVA實(shí)現(xiàn)驗(yàn)證碼實(shí)例
servlet生成驗(yàn)證碼圖片源碼
package com.javaweb.respones;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IdentityServlet extends HttpServlet{
    
//  設(shè)置字符
    public static final char[] chars="1234567890QWERTYUIOPASDFGHJKLZXCVBNM".toCharArray();
    
//  設(shè)置隨機(jī)數(shù)
    public static Random random = new Random();
    
//  獲取4位隨機(jī)數(shù)
    public static String getRandomString(){
        StringBuffer buffer = new StringBuffer();
        int index;   //獲取隨機(jī)chars下標(biāo)
        for(int i=0;i<4;i++){
            index = random.nextInt(chars.length);  //獲取隨機(jī)chars下標(biāo)
            buffer.append(chars[index]);
        }
        return buffer.toString();
    }
    
//  獲取隨機(jī)顏色
    public static Color getRandomColor(){
        return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
    }
    
//  返回某顏色的反色
    public static Color getReverseColor(Color c){
//      防止反色和原色相近
        if(c.getRed()<130&&c.getRed()>125 && c.getBlue()<130&& c.getBlue()>125 &&
                c.getGreen()<130&&c.getGreen()>125){
            return new Color(255,255,255);
        }else{
            return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
        }
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        String code = getRandomString();  //獲取隨機(jī)驗(yàn)證碼
        req.getSession().setAttribute("code", code); //放入Session
        
        int width = 100;    //圖片寬度
        int height = 30;    //圖片高度
        
        Color color =   getRandomColor();  //隨機(jī)色酒奶,用于背景色
        Color reverse = getReverseColor(color);  //反色,用于前景色
        
        
        /**
         * 生成帶字符串的文本圖片
         */
//      1.創(chuàng)建圖片緩存區(qū)     傳參為寬高和圖片類型
        BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//      2.獲取畫筆并繪畫
        Graphics g = bi.getGraphics();
        g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//設(shè)置字體
        g.setColor(color);//設(shè)置畫筆顏色
        g.fillRect(0, 0, width, height);   //繪制背景
        g.setColor(reverse);   //設(shè)置畫筆顏色
        g.drawString(code, 18, 20); //繪制字符
//      設(shè)置最多100個(gè)噪音點(diǎn)
        for(int i=0,n = random.nextInt(100);i<n;i++){
            g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
        }
        
//      3.輸出圖片
        ImageIO.write(bi, "JPG", resp.getOutputStream());
    }
    
}

生成圖片驗(yàn)證碼主要應(yīng)用隨機(jī)數(shù)生成器Random生成隨機(jī)顏色繪制背景虏杰,取反色*繪制字符,并繪制最多100隨機(jī)位置的噪音點(diǎn)讥蟆,增加識(shí)別難度。

配置XML
  <servlet>
    <servlet-name>IdentityServlet</servlet-name>
    <servlet-class>com.javaweb.respones.IdentityServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>IdentityServlet</servlet-name>
    <url-pattern>/servlet/IdentityServlet</url-pattern>
  </servlet-mapping>
html展示頁(yè)面
<head>
    <script type="text/javascript">
    function reloadImage(){
        document.getElementById('btn').disable=true;
        document.getElementById('identity').src='servlet/IdentityServlet?time='
            +new Date().getTime();      
    }
    </script>
  </head>
  
  <body>
    <img src = "servlet/IdentityServlet" id="identity" onload="btn.disabled= false;">
    <input type="button" value="換個(gè)圖片" onclick="reloadImage()" id="btn">
  </body>
截圖展示


下篇介紹利用組件Jcaptcha和Kaptcha生成驗(yàn)證碼纺阔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘸彤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笛钝,更是在濱河造成了極大的恐慌质况,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玻靡,死亡現(xiàn)場(chǎng)離奇詭異结榄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)囤捻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門臼朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝎土,你說我怎么就攤上這事视哑。” “怎么了誊涯?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵挡毅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我暴构,道長(zhǎng)跪呈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任取逾,我火速辦了婚禮耗绿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砾隅。我一直安慰自己缭乘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堕绩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邑时。 梳的紋絲不亂的頭發(fā)上奴紧,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音晶丘,去河邊找鬼黍氮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浅浮,可吹牛的內(nèi)容都是我干的沫浆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滚秩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼专执!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起郁油,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤本股,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后桐腌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拄显,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年案站,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躬审。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟆盐,死狀恐怖承边,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舱禽,我是刑警寧澤炒刁,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站誊稚,受9級(jí)特大地震影響翔始,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜里伯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一城瞎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疾瓮,春花似錦脖镀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弦蹂。三九已至,卻和暖如春强窖,著一層夾襖步出監(jiān)牢的瞬間凸椿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工翅溺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脑漫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓咙崎,卻偏偏與公主長(zhǎng)得像优幸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褪猛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評(píng)論 25 707
  • http://blog.csdn.net/ayhlay/article/details/13625275 1.驗(yàn)證...
    蘋果_283e閱讀 447評(píng)論 0 0
  • 昨天媽媽打電話說网杆,姑爺病了,也沒人照顧握爷,現(xiàn)在一個(gè)人在家也挺孤單的跛璧。我心里瞬間酸酸的。 姑爺之于我就像《天堂電影院》...
    淘汽十一郎閱讀 904評(píng)論 0 0
  • (一)搖籃計(jì)劃 “殺戮和死亡從來都不是原罪座柱,出生才是∥锸妫”——藍(lán)星舊約 藍(lán)星出事了色洞。 這些天來,不詳?shù)念A(yù)感越來越強(qiáng)烈...
    諸葛妖道閱讀 1,160評(píng)論 0 4
  • 基督能量的出發(fā)點(diǎn)是人與人之間的平等與手足之情冠胯,一旦這一能量在你心中覺醒火诸,你會(huì)將他人看作某一整體的一部分,...
    靜心521閱讀 2,362評(píng)論 0 0